Сравнение списка словарей, когда ключи вышли из строя - PullRequest
1 голос
/ 14 марта 2020

У меня есть 2 списка словарей.

a = [{"name": "hello", "city": "xyz"},{"city": "rty", "name": "ert"}]
b = [{"city": "xyz","name": "hello"},{"name": "ert", "city": "rty"}]

Приведенные выше два списка равны. Но если я сделаю сравнение, используя ==, это даст False. Как я могу проверить на равенство между двумя списками словарей, когда ключи могут быть не в порядке?

Ответы [ 2 ]

1 голос
/ 14 марта 2020

Я почти уверен, что вы как-то ошиблись. Я и другие получаем True:

>>> a = [{"name": "hello", "city": "xyz"},{"city": "rty", "name": "ert"}]
>>> b = [{"city": "xyz","name": "hello"},{"name": "ert", "city": "rty"}]
>>> a == b
True

И это то, что должно сделать.

Документация о OrderedDict гласит ( выделение):

Тесты на равенство между OrderedDict объектами и другими Mapping объектами нечувствительны к порядку, как обычные словари .

И документация о Сравнениях значений говорит об этом, что относится к этим диктам:

Отображения (экземпляры dict) сравниваются равными, если и только если они имеют равные (ключ, значение) пары.

0 голосов
/ 14 марта 2020

, если вы хотите знать, имеют ли каждый список одинаковые dict, даже если элементы dict могут не занимать одинаковые позиции в списках (как вы упоминаете в комментариях), вы можете использовать:

a = [{"name": "hello", "city": "xyz"},{"city": "rty", "name": "ert"}]
b = [{"name": "ert", "city": "rty"}, {"city": "xyz","name": "hello"}]

print(a == b)
print(sorted(a, key=lambda d: sorted(d.items())) == sorted(b, key=lambda d: sorted(d.items())))

вывод:

False
True
...