2011-12-08 23 views
15

में एक शब्दकोश को फ़िल्टर करने का सबसे अच्छा तरीका मेरे पास स्ट्रिंग कुंजियों और फ्लोट मानों का एक शब्दकोश है।पायथन

mydict = {} 
mydict["joe"] = 20 
mydict["bill"] = 20.232 
mydict["tom"] = 0.0 

मैं केवल उन जोड़े को शामिल करना चाहता हूं जिनमें शून्य से अधिक मान है।

dict = dict.Where(r=>r.Value > 0); 

अजगर में बराबर कोड क्या है:

सी # में, मैं कुछ इस तरह करना होगा?

d2 = dict((k, v) for k, v in d1.items() if v > 0) 

वैसे, ध्यान दें कि dict पहले से ही अजगर में आरक्षित है:

उत्तर

40
d = dict((k, v) for k, v in d.iteritems() if v > 0) 

अजगर 2.7 में और ऊपर, वहाँ इस के लिए अच्छे वाक्य रचना है:

d = {k: v for k, v in d.items() if v > 0} 

ध्यान दें कि यह सख्ती से एक फिल्टर है क्योंकि यह एक नया शब्दकोश पैदा करता है नहीं है।

0

अपने मूल शब्दकोश मान लिया जाये कि d1 आप की तरह कुछ का उपयोग कर सकता है।

0

dict निर्माता (key,value) जोड़े का एक अनुक्रम ले जा सकते हैं, और एक dict की iteritems विधि (key,value) जोड़े का एक अनुक्रम पैदा करता है। यह दो महान स्वाद है जो एक साथ महान स्वाद लेते हैं।

newDict = dict([item for item in oldDict.iteritems() if item[1] > 0]) 
1

कोशिश

y = filter(lambda x:dict[x] > 0.0,dict.keys()) 

लैम्ब्डा dict से चाबी फ़ीड है, और, प्रत्येक कुंजी के लिए dict में मान तुलना मानदंडों के खिलाफ, स्वीकार्य चाबियाँ वापस लौटने।

+1

प्रश्नकर्ता, एक शब्दकोश लौटने के लिए लग रही है यह केवल शब्दकोश की चाबी देता है। और यह @ kindall के उत्तर –

+1

से कम कुशल/पायथनिक है यह हो सकता है: 'd = dict (फ़िल्टर (लैम्ब्डा x: x [1]> 0.0, d.items()))' – Jeffery

0
foo = {} 
foo["joe"] = 20 
foo["bill"] = 20.232 
foo["tom"] = 0.0 

bar = dict((k,v) for k,v in foo.items() if v>0) 

dict पायथन में एक कीवर्ड है इसलिए मैंने इसे foo के साथ बदल दिया।

0

सब से पहले आप एक चर नाम के रूप में कीवर्ड dict उपयोग नहीं करना चाहिए के रूप में यह नाम स्थान को प्रदूषित करता है, और आप वर्तमान या एम्बेडेड दायरे में dict वर्ग को संदर्भित करने से रोकता है।

d = {} 
d["joe"] = 20 
d["bill"] = 20.232 
d["tom"] = 0.0 

# create an intermediate generator that is fed into dict constructor 
# via a list comprehension 
# this is more efficient that the pure "[...]" variant 
d2 = dict(((k, v) for (k, v) in d.iteritems() if v > 0)) 

print d2 
# {'bill': 20.232, 'joe': 20} 

वैकल्पिक रूप से, तुम सिर्फ इस पर जनरेटर और इटरेटर सीधे बना सकते हैं। यह एक "फ़िल्टर" की तरह है, क्योंकि जनरेटर केवल सबसेट प्रतिलिपि बनाने के बजाय मूल निर्देश में मानों का संदर्भ देता है; और इसलिए एक नया शब्दकोश बनाने की तुलना में अधिक कुशल है:

filtered = ((k, v) for (k, v) in d.iteritems() if v > 0) 

print filtered 
# <generator object <genexpr> at 0x034A18F0> 

for k, v in filtered: 
    print k, v 

# bill 20.232 
# joe 20