2010-05-11 17 views
8

Aşağıdaki sözlük var: Yukarıdaki sözlükte birden fazla anahtar mevcut olup olmadığınıPython sözlüğünde birçok anahtarın varlığını nasıl kontrol edersiniz?

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

ben böyle bir şey yapacak, kontrol etmek için: Yukarıda

'stackoverflow' in sites and 'serverfault' in sites 

sadece 2 ile muhafaza edilebilir anahtar aramalar. Çok büyük bir sözlükte çok sayıda anahtarı kontrol etmenin daha iyi bir yolu var mı?

cevap

12

Sen dict anahtarlarını olan bir dizi iddia ve sonra kullanabilirsiniz set.issubset: Herkes için

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

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

Sen all kullanabilirsiniz:

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 ve jeneratör ifade fakat -1 ('ekstra Pars için _ sitelerde) ve değişken isminiz olarak '_' kullanmak içindir. Kullandığınız her şeyin bir atmaca değişkeni olduğunu anlıyorum, ama değişken bir isim olarak “_” bir şekilde anlamımı yavaşlatıyor. Neden sadece "(s in sitesindeki" ("stackoverflow", "meta")) 'dır. Bu aslında set-tabanlı çözüm üzerinde bir avantajı vardır, çünkü kontrol edilmesi gereken sitelerin uzun listesinin bir setinin oluşturulması gerekli değildir ve ilk uyumsuzluk bulunur bulunmaz “all” kısa devre olacaktır. – PaulMcG

+0

@Paul, yorumunuz için teşekkürler. Ne söyleyebilirim ama katılıyorum! Teknik liyakat anlayışınız için – unutbu

+0

+1! – PaulMcG

0

kaç aramaları yapmak planlıyorsun? Kullandığınız yöntemin iyi olduğunu düşünüyorum.

Karşılaştığınız düzinelerce yüzlerce anahtar varsa, hedef anahtarların tümünü bir listeye yerleştirebilir ve sonra her bir öğenin sözlükte olduğundan emin olmak için listenin üzerinde yineleyebilirsiniz.

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()' ye ihtiyacınız yoktur ve muhtemelen kullanmamalı. İhtiyacınız olmayan bir liste oluşturur ve 'in' ifadenizi O (1) yerine O (n) olarak değiştirir. Bunun yanı sıra, bu, söz konusu sitelerin sözlüklerin bir parçası (değil) listelerini almak için oldukça okunabilir bir yoldur. – tgray

İlgili konular