У меня есть 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
Хотя это несколько работает, я ищу более эффективный способ сделать это, перебирая отправку, а не строку. Есть ли более простой или эффективный способ, прокручивая отправку, чтобы перезаписать соответствующее значение в строке?
Вы можете использовать for i, bits in enumerate(bit): вместо увеличения i самостоятельно.
@ Отметьте отправленные материалы, помеченные как таковые, чтобы они соответствовали столбцу и строке, поэтому они будут извлечены Column_Row
Переберите 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 Это ожидаемое поведение?
У меня была опечатка, я написал $ там, где имел ввиду ^.
Это сделало трюк! Цените это, так как это обеспечивает большую гибкость, чем моя первоначальная попытка.
Кажется, вы пытаетесь преобразовать часть ключей после "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
Тем не менее, я бы, вероятно, сделал что-то более безопасное в рабочей среде, например, синтаксический анализ ключа для его индекса.
Вы не говорите об этом явно, причина в том, что extracted1_1 соответствует первому элементу в первой строке, потому что ключ заканчивается на 1_1? Ваш код, похоже, не смотрит на ключи, но зависит от порядка (что не очень хорошая идея с диктовками).