Pythonic способ проверить, если два словаря имеют одинаковый набор ключей? - PullRequest
23 голосов
/ 09 июля 2010

Например, допустим, у меня есть словари:

d_1 = {'peter': 1, 'adam': 2, 'david': 3}

и

d_2 = {'peter': 14, 'adam': 44, 'david': 33, 'alan': 21}

Какой самый умный способ проверить, содержат ли два словаря одинаковый набор ключей? В приведенном выше примере он должен вернуть False, потому что d_2 содержит ключ 'alan', а d_1 - нет. Обратите внимание, что меня не интересует проверка того, что соответствующие значения для каждого ключа одинаковы, просто набор ключей одинаков.

Ответы [ 6 ]

28 голосов
/ 09 июля 2010

В Python2,

set(d_1) == set(d_2)

В Python3 вы можете сделать это, что может быть чуть более эффективным, чем создание наборов

d1.keys() == d2.keys()

хотя способ Python2 тоже будет работать

26 голосов
/ 09 июля 2010

Вы можете получить ключи для словаря с помощью dict.keys ().

Вы можете превратить это в набор с помощью набора (dict.keys ())

Вы можете сравнивать наборыс ==

Подводя итог:

set(d_1.keys()) == set(d_2.keys())

даст вам то, что вы хотите.

3 голосов
/ 05 февраля 2017
  • В Python 3 dict.keys() возвращает « объект представления », который можно использовать как набор. Это гораздо эффективнее, чем создание отдельного набора.

    d_1.keys() == d_2.keys()
    
  • В Python 2.7 dict.viewkeys() делает то же самое.

    d_1.viewkeys() == d_2.viewkeys()
    
  • В Python 2.6 и ниже вы должны создать набор ключей для каждого диктанта.

    set(d_1) == set(d_2)
    

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

    len(d_1) == len(d_2) and all(k in d_2 for k in d_1)
    
0 голосов
/ 09 июля 2010

Одним из способов является проверка симметричной разности (новый набор с элементами либо в s, либо в t, но не в обоих):

set(d_1.keys()).symmetric_difference(set(d_2.keys()))

Но более короткий способ - просто сравнитьнаборы:

set(d_1) == set(d_2)
0 голосов
/ 09 июля 2010

Быстрый вариант (не уверен, что он самый оптимальный)

len(set(d_1.keys()).difference(d_2.keys())) == 0
0 голосов
/ 09 июля 2010
>>> not set(d_1).symmetric_difference(d_2)
False
>>> not set(d_1).symmetric_difference(dict.fromkeys(d_1))
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...