Перейти к содержимому

Как сравнить два словаря

  • автор:

Сравнение значений из двух словарей

Надо новый список сравнить со старым, т.е. берем первый элемент «параметр:значения», прогнать по старому списку, проверить, есть ли оно и изменилось ли значение относительно старого списка если да, то вывести этот параметр со значением.
должно выдать

{'A6187': 87391}, {'A6204': 87392}

и так с каждым элементом
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Сравнение значений словарей
Здравствуйте, господа программисты! Сам я только начинающий программист в Python. Вопрос следующий.

Сравнение словарей и получение общей суммы
Добрый день. 4 час ломаю голову не могу понять, как это сделать. есть 2 словаря формата: .

Сравнение двух колонок с целью поиска одинаковых значений
Коллеги, вечер добрый! Имеется две колонки: одна 450 тыс значений, другая 1.5 млн. Надо найти.

Сравнение двух словарей
Помогите пожалуйста. Есть 2 словаря. В один даные вносятся сразу, а во второй при вводе в.

2421 / 1463 / 633
Регистрация: 01.11.2021
Сообщений: 2,266

Тут, скорее кто-то лучше предложит, я что-то запутался немного ) По мне так проще было бы использовать просто словари, если такая возможность есть, то лучше так:

1 2 3 4 5 6
New = {'A5955': 87393, 'A6187': 87393, 'A6204': 87393} Old = {'A5955': 87393, 'A6187': 87391, 'A6204': 87392}
1 2 3 4 5 6 7 8 9
New = [{'A5955': 87393}, {'A6187': 87393}, {'A6204': 87393}] Old = [{'A5955': 87393}, {'A6187': 87391}, {'A6204': 87392}] for el in New: for k1, v1 in el.items(): for elem in Old: for k2, v2 in elem.items(): if k1 == k2 and v1 != v2: print(el, end=', ')

Регистрация: 11.02.2013
Сообщений: 146
ну , вроде рабочий вариант, спасибо. Сейчас попробую поиграться с большими объемами данных
1996 / 1137 / 409
Регистрация: 21.11.2021
Сообщений: 2,324

1 2 3
old = {'A5955': 87393, 'A6187': 87391, 'A6204': 87392} new = {'A5955': 87393, 'A6187': 87393, 'A6204': 87393} print( { k:v for (k,v) in old.items() if old[k] != new[k] } )

2421 / 1463 / 633
Регистрация: 01.11.2021
Сообщений: 2,266

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

1 2 3 4 5 6 7 8 9
New = [{'A5955': 87393}, {'A6187': 87393}, {'A6204': 87393}] Old = [{'A5955': 87393}, {'A6187': 87391}, {'A6204': 87392}] for el in New: k1, *_ = list(el) for elem in Old: if elem.get(k1, None) and el[k1] != elem[k1]: print(el) break

Добавлено через 46 секунд
idealist,
у него список словарей из одной пары, что неудобно очень.
1996 / 1137 / 409
Регистрация: 21.11.2021
Сообщений: 2,324

ЦитатаСообщение от Alexarh Посмотреть сообщение

у него список словарей из одной пары, что неудобно очень.
Да не, автор считает, что это словари, а в них значения:

ЦитатаСообщение от AdDa Посмотреть сообщение

даны 2 словаря Новый и старый, очередность значений в обоих может быть разной

Короче, противоречие между текстом задания и примерами.
На мутный вопрос ясного ответа при всем старании не получить!

Регистрация: 11.02.2013
Сообщений: 146

1 2 3 4 5 6
for el in New: k1, *_ = list(el) for elem in Old: if elem.get(k1, None) and el[k1] != elem[k1]: print(el) break

Так наверное не пойдет, мне дальше надо работать со значением этого параметра.
А вариант от idealist, выдает ошибку «AttributeError: ‘list’ object has no attribute ‘items'»

1996 / 1137 / 409
Регистрация: 21.11.2021
Сообщений: 2,324

ЦитатаСообщение от AdDa Посмотреть сообщение

выдает ошибку «AttributeError: ‘list’ object has no attribute ‘items'»

А первую и вторую строчку вы мои вводили или свои вставили?
У меня там словари, а у вас списки словарей. Список действительно не имеет такого атрибута.
Так у вас ошибка в ваших примерах или что? Там словари должны быть или списки словарей?

2421 / 1463 / 633
Регистрация: 01.11.2021
Сообщений: 2,266

ЦитатаСообщение от AdDa Посмотреть сообщение

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

Так работай, вставляй код до brake свой. Просто дальше нет смысла искать и сравнивать элементы после того, как уже элемент нужный найден.

Эксперт Python

7651 / 4098 / 1791
Регистрация: 27.03.2020
Сообщений: 6,913
AdDa, как вариант

1 2 3 4 5 6 7 8 9 10 11 12
New = [{'A5955': 87393}, {'A6187': 87393}, {'A6204': 87393}] Old = [{'A5955': 87393}, {'A6187': 87391}, {'A6204': 87392}] res = set() for dct in Old: res |= set(dct.items()) for dct in New: res -= set(dct.items()) for elem in res: print(elem)

Регистрация: 11.02.2013
Сообщений: 146

ЦитатаСообщение от Gdez Посмотреть сообщение

for elem in res:
print(elem)
Он мне выводит <'A6204': 87392>, а как мне из этого получить отдельно, параметр(A6204) или значение (87392)?

Эксперт Python

7651 / 4098 / 1791
Регистрация: 27.03.2020
Сообщений: 6,913

1 2 3 4 5 6 7 8 9 10 11 12 13 14
New = [{'A5955': 87393}, {'A6187': 87393}, {'A6204': 87393}] Old = [{'A5955': 87393}, {'A6187': 87391}, {'A6204': 87392}] res = set() for dct in Old: res |= set(dct.items()) for dct in New: res -= set(dct.items()) for k, v in res: print(k) print(v) print()

Регистрация: 11.02.2013
Сообщений: 146
Gdez, благодарю
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Макрос, уникальные значения. Сравнение столбца А на двух листах . Без словарей
Здравствуйте, нужна помощь великих умов. Книга, два листа требуется сравнить данные столбцов А.

Сравнение двух значений
Здрастувуйте! На форме есть компонент Edit и Button. Нужно нажавши по кнопке сравнить вместимое.

Сравнение двух значений
Всем привет. Есть два поля <div <label for="d41">PI</label> <input.

Сравнение двух значений
Добрый день! У меня вопрос. Мне нужно сравнить 2 значения, и понять, сигнификантна ли разница.

Сравнение словарей?
Здравствуйте! Я, офисная крыса, обрабатывающая большие объемы информации, на старости лет.

Сравнение значений в двух ячейках
Коллеги, вопрос конечно простой, но пните пожалуйста в нужную сторону, мне не удалось правильно.

Как сравнить два словаря

Скачай курс
в приложении

Перейти в приложение
Открыть мобильную версию сайта

© 2013 — 2023. Stepik

Наши условия использования и конфиденциальности

Get it on Google Play

Public user contributions licensed under cc-wiki license with attribution required

Как сравнить два словаря python и узнать каких ключей нет в том или ином словаре

Мне необходимо написать код, который мог бы отображать ключ которого нет в другом словаре, как это можно сделать? В качестве результата должно получиться:

"key ['python'] not in dict ['cc']" # написал для примера 

Отслеживать
задан 14 сен 2021 в 14:00
869 2 2 золотых знака 8 8 серебряных знаков 29 29 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Ключи словаря — это множество. Множества можно вычитать:

a = b = print(a.keys()-b.keys()) print(b.keys()-a.keys()) 

Т.е. в данном случае множество ключей первого словаря целиком есть во втором словаре.
А вот во втором словаре не хватает двух ключей относительно первого словаря.

Отслеживать
ответ дан 14 сен 2021 в 14:05
67.7k 5 5 золотых знаков 20 20 серебряных знаков 51 51 бронзовый знак

+1, не знал, что ключи словаря могут играть роль множества, точнее что этим занимается тип dict_keys , хотя проверку isinstance на set проваливает 🙂

14 сен 2021 в 14:51

@gil9red Да я сам немного удивился, что к множеству не нужно приводить, проверил на всякий — и так прокатило )

14 сен 2021 в 16:02

Можно через множества получить разницу в ключах словарей

d1 = d2 = result = set(d1).difference(set(d2)) if result: print(f'В d2 нет ключей d1: ') else: print('В d1 все ключи d2') result = set(d2).difference(set(d1)) if result: print(f'В d1 нет ключей d2: ') else: print('В d2 все ключи d1') 
В d1 все ключи d2 В d1 нет ключей d2:

UPD.

Вместо difference можно использовать оператор — , пример:

result = set(d1) - set(d2) 

fcmax

Казалось бы тривиальная задача, но если решать её в лоб и без хитрости, присущей языку python, можно такой огород из итераций нагородить что мама не горюй. В общем, ниже представлен класс, который сделает волосы шелковистыми, а сон крепким и более продолжительным.

class DictDiffer(object): """ Calculate the difference between two dictionaries as: (1) items added (2) items removed (3) keys same in both but changed values (4) keys same in both and unchanged values """ def __init__(self, current_dict, past_dict): self.current_dict, self.past_dict = current_dict, past_dict self.set_current, self.set_past = set(current_dict.keys()), set(past_dict.keys()) self.intersect = self.set_current.intersection(self.set_past) def added(self): return self.set_current - self.intersect def removed(self): return self.set_past - self.intersect def changed(self): return set(o for o in self.intersect if self.past_dict[o] != self.current_dict[o]) def unchanged(self): return set(o for o in self.intersect if self.past_dict[o] == self.current_dict[o])
>>> a = 'a': 1, 'b': 1, 'c': 0> >>> b = 'a': 1, 'b': 2, 'd': 0> >>> d = DictDiffer(b, a) >>> print "Added:", d.added() Added: set(['d']) >>> print "Removed:", d.removed() Removed: set(['c']) >>> print "Changed:", d.changed() Changed: set(['b']) >>> print "Unchanged:", d.unchanged() Unchanged: set(['a'])

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

https://alkogolizm.vyvod-iz-zapoya-v-stacionare-samara11.ru/