2012-09-11 65 views
11

python程序員如何檢查字典的任何值是否與條件匹配(在我的情況下大於0)。我正在尋找對性能影響最小的「pythonic」方式。檢查字典的任何值是否與條件匹配

我的字典裏:

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

我用這2(可怕的?)方法爲止。

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

您是否正在檢查字典中的一個條目(如您的文本所述)或所有條目(如您的代碼所做的)? – smcg

+0

@smcg:對不起,我的英語。我的意思是所有的條目;] – Firebowl2000

回答

20

您可以使用any[docs]

>>> 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 

參見all[docs]

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

由於您使用的Python 2.7,.itervalues()可能比.values()好一點,因爲它不創建一個新的列表。

+0

感謝帝斯曼!這非常有用。 – Firebowl2000

+0

我會盡可能地說這是做這件事的pythonic方式。 –

+0

我經常想知道'.values'和'.itervalues'之間究竟有多少差別 - 畢竟,你不是在創建新的對象,只是新的引用......我想這是值得多少內存一個Python參考實際上需要...(我通常只是使用'values',因爲當我將代碼移動到py3k時不需要更改......但是也許我不應該......)雖然答案很好。這是肯定的方式去(+ 1) – mgilson

相關問題