добавить элемент из dict в другой dict с ключевым условием

#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. Вы также можете создать кортеж в качестве значения