简体   繁体   中英

Python Replace values in list with dict

I have 2 variables I am trying to manipulate the data. I have a variable with a list that has 2 items.

row = [['Toyyota', 'Cammry', '3000'], ['Foord', 'Muustang', '6000']]

And a dictionary that has submissions

submission = {
    'extracted1_1': 'Toyota', 'extracted1_2': 'Camry', 'extracted1_3': '1000', 
    'extracted2_1': 'Ford', 'extracted2_2': 'Mustang', 'extracted2_3': '5000', 
    'reportDate': '2022-06-01T08:30', 'reportOwner': 'John Smith'}

extracted1_1 would match up with the first value in the first item from row. extracted1_2 would be the 2nd value in the 1st item, and extracted2_1 would be the 1st value in the 2nd item and so on. I'm trying to update row with the corresponding submission and having a hard time getting it to work properly.

Here's what I have currently:

iter_bit = iter((submission.values()))

for bit in row:
    i = 0
    for bits in bit:
        bit[i] = next(iter_bit)
        i += 1

While this somewhat works, i'm looking for a more efficient way to do this by looping through the submission rather than the row. Is there an easier or more efficient way by looping through the submission to overwrite the corresponding value in row?

Iterate through submission , and check if the key is in the format extractedX_Y . If it does, use those as the indexes into row and assign the value there.

import re

regex = re.compile(r'^extracted(\d+)_(\d+)$')

for key, value in submissions.items():
    m = regex.search(key)
    if m:
        x = int(m.group(1))
        y = int(m.group(2))
        row[x-1][y-1] = value

It seems you are trying to convert the portion of the keys after "extracted" to indices into row . To do this, first slice out the portion you don't need (ie "extracted" ), and then split what remains by _ . Then, convert each of these strings to integers, and subtract 1 because in python indices are zero-based.

for key, value in submission.items():
    # e.g. key = 'extracted1_1', value = 'Toyota'
    if not key.startswith("extracted"):
        continue

    indices = [int(i) - 1 for i in key[9:].split("_")]
    # e.g. indices = [0, 0]

    # Set the value
    row[indices[0]][indices[1]] = value

Now you have your modified row :

[['Toyota', 'Camry', '1000'], ['Ford', 'Mustang', '5000']]

No clue if its faster but its a 2-liner hahaha

  for n, val in zip(range(len(row) * 3), submission.values()):
     row[n//3][n%3] = val

that said, i would probably do something safer in a work environment, like parsing the key for its index.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM