2012-09-11 19 views
11

Bir python programcısı, bir sözlük değeri herhangi bir koşulla eşleşip eşleşmediğini kontrol eder (durumumda 0'dan büyüktür). En az performans etkisi olan en "pythonic" yolu arıyorum.Sözlüğün herhangi bir değeri bir koşulla eşleşiyorsa kontrol edin

benim sözlüğü:

pairs = { 'word1':0, 'word2':0, 'word3':2000, 'word4':64, 'word5':0, 'wordn':8 } 

şimdiye kadar bu 2 (? Canavarca) yöntemleri kullanılır.

1:

options = pairs.values() # extract values 
for i in options: 
    if i > 0: 
     return True 
return False 

2:

options = sorted(pairs.items(), key=lambda e: e[1], reverse=True) # rank from max to min 
if options[0][1] > 0: 
    return True 
else: 
    return False 
+0

Sözlüğünüzde (metniniz gibi) veya tüm girdilerde (kodunuz gibi) yalnızca bir giriş mi kontrol ediyorsunuz? – smcg

+0

@smcg: İngilizce'm için üzgünüm. Tüm girişleri kastediyorum;] – Firebowl2000

cevap

20

Sen any[docs] kullanabilirsiniz:

>>> pairs = { 'word1':0, 'word2':0, 'word3':2000, 'word4':64, 'word5':0, 'wordn':8 } 
>>> any(v > 0 for v in pairs.itervalues()) 
True 
>>> any(v > 3000 for v in pairs.itervalues()) 
False 

da allbakınız: yeni bir liste oluşturmak değil çünkü

>>> all(v > 0 for v in pairs.itervalues()) 
False 
>>> all(v < 3000 for v in pairs.itervalues()) 
True 

Python 2.7 kullandığınız için, .itervalues() muhtemelen .values() biraz daha iyidir.

+0

Teşekkürler DSM! Bu çok kullanışlı. – Firebowl2000

+0

Bunu yapmak için pythonic bir yol olduğunu söyleyerek gidebilirim. –

+0

Sık sık ".values" ve ".itervalues" arasında gerçekten ne kadar fark olduğunu merak ediyorum - Sonuçta, yeni nesneler yaratmıyorsunuz, sadece yeni referanslar ... Sanırım bir python referansının ne kadar belleğe sahip olduğunu sormaya değer. Aslında alır ... (Ben sadece '' değerleri kullanıyorum çünkü kodumu py3k'ye taşıdığımda değiştirilmem gerekmeyecek ... ama belki de yapmamalıyım…) İyi cevap olsa da. Bu kesinlikle bu konuda gitmek için bir yoldur (+1) – mgilson

İlgili konular