Home > OS >  How to append to second value of dictionary value after underscore in 1 manner
How to append to second value of dictionary value after underscore in 1 manner

Time:07-30

Imagine I have a dictionary as such:

barcodedict={"12_20":[10,15,20], "12_21":[5, "5_1","5_2",6]}

Then I have a number that corresponds to a date, lets say 12_21 and we append it to the values of this date if it is not there as such:

if 8 not in barcodedict["12_21"]:
   barcodedict["12_21"].append(8)
{'12_20': [10, 15, 20], '12_21': [5, "5_1", "5_2", 6, 8]}

However, if this number is already present in the value list, I want to add it to the value list with an extra integer that states that its a new occurrence as such:

if 5 not in barcodedict["12_21"]:
   barcodedict["12_21"].append(5)
else: #which is now the case
   barcodedict["12_21"].append(5_(2 1))
Desired output:
{"12_20":[10,15,20], "12_21":[5, "5_1","5_2","5_3",6, 8]}

As can be seen from the second example, I am not allowed to put underscore in list numbers and they are removed (5_1 becomes 51). And how can I achieve adding a new listing with 1 to the last number? I tried iterating over them and then splitting them but this seems unpythonic and didn't work because the underscore is ignored.

Edit 7/19/2022 10:46AM,

I found a bit of a hackish way around but it seems to hold for now:

placeholder=[]
for i in barcodedict["12_21"]:
    if "5" in str(i):
        try:
            placeholder.append(str(i).split("_")[1])
        except:
            print("this is for the first 5 occurence, that has no _notation")
print(placeholder)

if len(placeholder) == 0 :
    placeholder=[0]

occurence=max(list(map(int, placeholder))) 1
barcodedict["12_21"].append("5_" occurence)

prints {'12_20': [10, 15, 20], '12_21': [5, '5_1', '5_2', 6, '5_3']}

CodePudding user response:

With the requested number/string mixture it can be done with:

if 5 not in barcodedict["12_21"]:
   barcodedict["12_21"].append(5)
else: #which is now the case
   i = 1
   while True:
      if f"5_{i}" not in barcodedict["12_21"]:
         barcodedict["12_21"].append(f"5_{i}")
         break
      i  = 1

CodePudding user response:

Another solution:

def fancy_append(dct, key, val):
    last_num = max(
        (
            int(s[1])
            for v in dct[key]
            if isinstance(v, str) and (s := v.split("_"))[0] == str(val)
        ),
        default=0,
    )
    dct[key].append(f"{val}_{last_num 1}" if last_num > 0 else val)


barcodedict = {"12_20": [10, 15, 20], "12_21": [5, "5_1", "5_2", 6]}
fancy_append(barcodedict, "12_21", 5)
print(barcodedict)

Prints:

{'12_20': [10, 15, 20], '12_21': [5, '5_1', '5_2', 6, '5_3']}

CodePudding user response:

Underscores used like that do not show up in print, because they are meant to be used for convenience in representing big numbers, but when interpreted they don't show like that. You should use string manipulation if the way they're are displayed matters, or the other way around if you want to actually use them as numbers and want simply to represent them in a convenient way.

  • Related