#python #dictionary
#python #словарь
Вопрос:
Я хочу добавить элемент из dict в другой dict, чтобы ключ имел то же значение, например, у меня есть
A = [{ 'A' : 3 , 'B_id' : 1009 }, { 'A' : 3 , 'B_id' : 1010 }]
B = [{ 'B_id' : 1009 , 'C' : 9 } , { 'B_id' : 1010 , 'C' : 10 }, { 'B_id' : 1011 , 'C' : 11 }]
я хочу добавить ‘C’ из B в A, только если ‘B_id’ из B равно ‘B_id’ из A
, поэтому A должно быть
A = [{ 'A' : 3 , 'B_id' : 1009, 'C' : 9}, { 'A' : 3 , 'B_id' : 1010, 'C' : 10 }]
я попытался зациклить ключ A, B, и это очень медленно … любой способ ускорить это?
Это код:
for row in A:
for rows in B:
if(row['B_id'] == rows['B_id']):
row['C'] = rows['C']
Комментарии:
1. Извините, отредактировано @ggorlen спасибо, что заметили это!
2. Да; используйте векторизованные операции и
where
предложение filter / . Посмотрите ваши дружественные соседские руководства PANDAS для этих концепций.
Ответ №1:
Предполагая B_id
, что значения уникальны, вы можете создать словарь поиска:
A = [{'A': 3, 'B_id': 1009}, {'A': 3, 'B_id': 1010}]
B = [{'B_id': 1009, 'C': 9}, {'B_id': 1010, 'C': 10}, {'B_id': 1011, 'C': 11}]
lookup = {d['B_id'] : d['C'] for d in B}
for a in A:
if a['B_id'] in lookup:
a['C'] = lookup[a['B_id']]
print(A)
Вывод
[{'A': 3, 'B_id': 1009, 'C': 9}, {'A': 3, 'B_id': 1010, 'C': 10}]
(Ожидаемая) временная сложность этого подхода равна O (N).
Комментарии:
1. Вау, спасибо! что, если у меня есть другой ключ, скажем, c_id для A, B, и я хочу добавить только тогда, когда оба B_id и C_id совпадают @Dani Mesejo
2. @Wizarduy вы можете использовать кортеж в качестве ключа, кортеж будет состоять из значений C_id и B_id
3. поиск = {d[‘B_id’]: d[‘C’] для d в B} lookup2 = {d[‘C_id’]: d[‘C’] для d в B} для a в A: если (a[‘B_id’] в поиске и a[‘C_id’] в lookup2): a[‘C’] = lookup[a[‘B_id’]] я использую это сейчас, Спасибо! это работает
4. если я хочу добавить, что B содержит другой ключ, скажем, D, и я хочу добавить оба ‘C’ и ‘D’, как мне создать поиск в этом случае
5. Вы также можете создать кортеж в качестве значения