Как сравнить словари внутри списков
Мне было интересно, поможешь ли ты мне.
У меня есть два списка, которые содержат словари, по большей части эти ключи одинаковы. Ниже приведен краткий пример:
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, но я думал, что это может быть слишком медленно».
Я не думаю, что это очень хороший способ сделать это. Вот почему я здесь 🙂
Заранее спасибо.
- Python или Ruby для .NET-разработчика?
- Сравнение списков, содержащих NaN
- Как инструмент тестирования графического интерфейса пользователя PyUseCase сравнивается с Dogtail?
- Python: слияние словаря путем обновления, но не перезаписи, если существует значение
- Найти совпадающие точки в 2 отдельных массивах numpy
Если я правильно понимаю, что вы хотите, это что-то вроде этого, что работает, превратив два списка в словари со значениями «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)]
Этот код работает в одном направлении. Вы можете адаптировать его в обоих направлениях или просто использовать его дважды.
- Как добавить мой собственный метод к встроенному типу str?
- проверка каждого элемента в двумерном списке
- Целочисленный диапазон числа сравнения в Python
- Правило строки Python всегда возвращает false
- Сравнить объекты из более чем 2 списков
- Сравнение файлов, когда у меня есть имя хоста
- Сравнение списка разных размеров и данных для вывода разницы
- Почему эта строка ascii Python не эквивалентна регулярной строке?
- Как работает Pythons SequenceMatcher?
- два списка, более быстрое сравнение в python
- Сравнивая массивы NumPy так, чтобы NaN сравнивали равные