Python Заменить значения в списке на dict

У меня есть 2 переменные, которые я пытаюсь манипулировать данными. У меня есть переменная со списком, который имеет 2 элемента.

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

И словарь, в котором есть представления

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 будет соответствовать первому значению в первом элементе строки. Extracted1_2 будет 2-м значением в 1-м элементе, а Extracted2_1 будет 1-м значением во 2-м элементе и так далее. Я пытаюсь обновить строку с соответствующей отправкой, и мне трудно заставить ее работать должным образом.

Вот что у меня есть на данный момент:

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

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

Хотя это несколько работает, я ищу более эффективный способ сделать это, перебирая отправку, а не строку. Есть ли более простой или эффективный способ, прокручивая отправку, чтобы перезаписать соответствующее значение в строке?

Вы не говорите об этом явно, причина в том, что extracted1_1 соответствует первому элементу в первой строке, потому что ключ заканчивается на 1_1? Ваш код, похоже, не смотрит на ключи, но зависит от порядка (что не очень хорошая идея с диктовками).

Mark 10.01.2023 22:28

Вы можете использовать for i, bits in enumerate(bit): вместо увеличения i самостоятельно.

Barmar 10.01.2023 22:29

@ Отметьте отправленные материалы, помеченные как таковые, чтобы они соответствовали столбцу и строке, поэтому они будут извлечены Column_Row

RunRabbit 10.01.2023 23:17
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
3
80
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Переберите submission и проверьте, находится ли ключ в формате extractedX_Y. Если это так, используйте их в качестве индексов в row и назначьте там значение.

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

Когда я запускаю это, он показывает m = None Это ожидаемое поведение?

RunRabbit 10.01.2023 23:14

У меня была опечатка, я написал $ там, где имел ввиду ^.

Barmar 10.01.2023 23:15

Это сделало трюк! Цените это, так как это обеспечивает большую гибкость, чем моя первоначальная попытка.

RunRabbit 10.01.2023 23:23

Кажется, вы пытаетесь преобразовать часть ключей после "extracted" в индексы в row. Для этого сначала отрежьте ненужную часть (например, "extracted"), а затем разделите то, что осталось, на _. Затем преобразуйте каждую из этих строк в целые числа и вычтите 1, потому что индексы в Python отсчитываются от нуля.

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

Теперь у вас есть измененный row:

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

Не знаю, быстрее ли это, но это 2-строчный хахаха

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

Тем не менее, я бы, вероятно, сделал что-то более безопасное в рабочей среде, например, синтаксический анализ ключа для его индекса.

Другие вопросы по теме