Python Replace values in list with dict

Question:

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?

Asked By: RunRabbit

||

Answers:

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
Answered By: Barmar

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 (i.e. "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']]
Answered By: Pranav Hosangadi

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.

Answered By: PedroTurik
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.