Как сравнить словари внутри списков

Мне было интересно, поможешь ли ты мне.

У меня есть два списка, которые содержат словари, по большей части эти ключи одинаковы. Ниже приведен краткий пример:

x1 = [{'a':1,'b':"cat"},{'a':2,'b':"parrot"},...] x2 = [{'a':2,'b':"dog"},{'a':1,'b':"fish"},...] 

Теперь я хотел бы сравнить значения на основе ключа, т.е. ключа a, но длина обоих списков не всегда будет одинаковой. Ключ a всегда будет в обоих словарях, если есть соответствующий словарь, то есть x1[0]['a'] == x2[1]['a'] .

Как я мог сравнить эти словари на основе ключа a, чтобы я мог сначала отбросить те из x1 которые не отображаются в x2 , наоборот. Затем определите, появляются ли в обоих словарях определенные значения, а затем записывают их в базу данных, здесь это необязательно.

Я думал о том, чтобы объединить эти словари в кортеж в списке, основанном на ключе a. Затем повторите это и сравните эти значения. Это, вероятно, не самый лучший способ сделать это, поэтому, если у вас есть лучшие идеи, пожалуйста, не стесняйтесь. 🙂

[Редактировать.]

Прошу прощения. То, что я надеюсь сделать; first: сопоставить словари на основе ключа a. Второе: игнорируйте те, которые не совпадают (ключ a). В-третьих: сравнить ключ b. четвертый: обновить базу данных на основе сравнения b.

Спасибо всем, кто ответил.

Мой ответ будет примерно таким:

«Я думал, что список comp может сделать все возможное, чтобы построить кортеж, содержащий словарь из x1 который соответствует словарю из x2 , а затем перебирать каждый элемент сравнения b, но я думал, что это может быть слишком медленно».

Я не думаю, что это очень хороший способ сделать это. Вот почему я здесь 🙂

Заранее спасибо.

Если я правильно понимаю, что вы хотите, это что-то вроде этого, что работает, превратив два списка в словари со значениями «a» в качестве ключей. Он предполагает, что в каждом списке нет репликации значений «a» и возвращает словарь со значениями «a» в качестве ключей и кортежей парных «b» в качестве значений.

 x1 = [{'a':1,'b':"cat"}, {'a':2,'b':"parrot"}, {'a': 3, 'b': 'dog'}] x2 = [{'a':2,'b':"dog"}, {'a':1,'b':"fish"}] x1_d = {d['a']: d['b'] for d in x1} x2_d = {d['a']: d['b'] for d in x2} matched_keys = set(x1_d) & set(x2_d) result = {key: (x1_d[key], x2_d[key]) for key in matched_keys} print result # {1: ('cat', 'fish'), 2: ('parrot', 'dog')} 

Там могут быть более быстрые способы сделать это, но, может быть, вы могли бы подтвердить, что это тот результат, который вы ищете.

Я действительно не понимаю ваше сравнение, но я думаю, что вы хотите

 len(x1)==len(x2) and all(a['a']==b['a'] for (a, b) in zip(x1, x2)) 

или, что эквивалентно (но менее эффективно),

 [a['a'] for a in x1] == [b['a'] for b in x2] 

Если вы просто позвоните

 [ a['a'] == b['a'] for a, b in zip(x1, x2) ] 

вы получите список результатов сравнения. Если списки не одинаково длинны, тем меньше будет определено, сколько пар сравнивается.

Обратите внимание, что результатом будет список булевых значений ( True , False ). Если вы хотите что-нибудь еще, уточните это.

 x1 = [{'a':1,'b':"cat"},{'a':2,'b':"parrot"}] x2 = [{'a':2,'b':"dog"},{'a':1,'b':"fish"},{'a':3},{'a':2}] [(_x2,_x2['a'] in [_x1['a'] for _x1 in x1]) for _x2 in x2] [({'a': 2, 'b': 'dog'}, True), ({'a': 1, 'b': 'fish'}, True), ({'a': 3}, False), ({'a': 2}, True)] 

Этот код работает в одном направлении. Вы можете адаптировать его в обоих направлениях или просто использовать его дважды.