2010-05-11 2 views
8

У меня есть следующий словарь:Как проверить наличие множества ключей в словаре Python?

sites = { 
    'stackoverflow': 1, 
    'superuser': 2, 
    'meta': 3, 
    'serverfault': 4, 
    'mathoverflow': 5 
} 

Чтобы проверить, если есть более чем один ключ доступен в вышеуказанном словаре, я буду делать что-то вроде:

'stackoverflow' in sites and 'serverfault' in sites 

выше является ремонтопригодны только с 2 ключевые поисковые запросы. Есть ли лучший способ справиться с проверкой большого количества ключей в очень большом словаре?

ответ

12

Вы можете притвориться ключами Словаря является набором, а затем использовать set.issubset:

set(['stackoverflow', 'serverfault']).issubset(sites) # ==> True 

set(['stackoverflow', 'google']).issubset(sites) # ==> False 
9

Вы можете использовать all:

print(all(site in sites for site in ('stackoverflow','meta'))) 
# True 
print(all(site in sites for site in ('stackoverflow','meta','roger'))) 
# False 
+0

+1 для всех и выражения генератора, но -1 для дополнительных скобок на '(_ в сайтах) 'и для использования' _' в качестве имени переменной. Я понимаю, что все, что вы используете, является переменной throwaway, но '_' как имя переменной как-то просто замедляет мое понимание. Почему бы не просто «все (s в сайтах для s in (« stackoverflow »,« meta »)). Это фактически имеет преимущество перед решением, основанным на множестве, поскольку нет необходимости создавать набор длинного списка сайтов для проверки, а 'all' будет замыкаться на короткое замыкание, как только будет обнаружено первое несоответствие. – PaulMcG

+0

@Paul, спасибо за ваш комментарий. Что я могу сказать, но, согласен! – unutbu

+0

+1 для вашего проницательного суждения о технических достоинствах! – PaulMcG

0

Сколько поиски вы планируете делать? Я думаю, что метод, который вы используете, в порядке.

Если есть десятки, сотни и т. Д. Ключей, которые вы сравниваете с собой, вы можете поместить все целевые ключи в список, а затем перебирать список, проверяя, чтобы каждый элемент находился в словаре.

1
mysites = ['stackoverflow', 'superuser'] 
[i for i in mysites if i in sites.keys()] # ==> sites in the list mysites that are in your dictionary 
[i for i in mysites if i not in sites.keys()] # ==> sites in the list mysites that are not in your dictionary 
+0

Вам не нужно '.keys()' и, вероятно, не следует использовать его. Он создает список, который вам не нужен, и вместо него вместо оператора O (n) вместо O (1) вызывается ваш оператор 'in'. Кроме того, это очень читаемый способ получить списки сайтов, которые являются (не) частью словаря. – tgray

Смежные вопросы