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
не поддерживает. Обратите внимание: я не заинтересован в проверке того, что связанные значения для каждого ключа одинаковы, только то, что набор ключей один и тот же.
Ответы
Ответ 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