2010-07-09 1 views
13

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

ответ

18

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

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

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

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

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

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

+0

вам не нужны «ключи». – SilentGhost

+1

Даже проще, так как set (dict) дает только ключи ... –

+1

Правда, вам не нужны ключи, но если вы не используете множество очень часто, я бы сказал, что поведение set (dictionary) неочевидно. Кто-нибудь знает, влияет ли использование ключей на производительность? – xorsyst

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

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

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

ответ SilentGhost будет возвращать ложь, если ключи одинаковы, но значения различаются – Alex

+2

Проверка лена == 0, вероятно, наиболее unpythonic вещь. – SilentGhost

+0

@Alex Nope. Попробуй сам. – augurar

24

В python2,

set(d_1) == set(d_2) 

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

a отя путь python2 будет работать слишком

+1

+1 для Python 3 way – Joschua

0

Одним из способов является проверка symmetric difference (новый набор с элементами в любой S или Т, но не оба):

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

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

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

    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) 
    
Смежные вопросы