Подтвердить что ты не робот

Pythonic способ проверить, есть ли у двух словарей одинаковый набор ключей?

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

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

и

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

В Python2,

set(d_1) == set(d_2)

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

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

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

Ответ 3

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

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

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

    set(d_1) == set(d_2)
    

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

    len(d_1) == len(d_2) and all(k in d_2 for k in d_1)
    

Ответ 4

>>> not set(d_1).symmetric_difference(d_2)
False
>>> not set(d_1).symmetric_difference(dict.fromkeys(d_1))
True

Ответ 5

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

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

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

set(d_1) == set(d_2)

Ответ 6

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

len(set(d_1.keys()).difference(d_2.keys())) == 0