2010-06-09 3 views
5

मान लें कि मेरे पास एक शब्दकोश है जिसका कुंजी तार हैं। मैं उस से एक नया शब्दकोश कुशलतापूर्वक कैसे बना सकता हूं जिसमें केवल कुछ सूची में मौजूद कुंजी शामिल हों?पायथन

उदाहरण के लिए

:

# a dictionary mapping strings to stuff 
mydict = {'quux': ..., 
      'bar': ..., 
      'foo': ...} 

# list of keys to be selected from mydict 
keys_to_select = ['foo', 'bar', ...] 

तरह से मैं के साथ आया है:

filtered_mydict = [mydict[k] for k in mydict.keys() \ 
        if k in keys_to_select] 

लेकिन मुझे लगता है यह अत्यधिक अक्षम है क्योंकि: (1) यह कुंजी के साथ कुंजी की गणना की आवश्यकता है() , (2) इसे प्रत्येक बार key_to_select में k को देखने की आवश्यकता है। इनमें से कम से कम एक से बचा जा सकता है, मुझे लगता है। कोई विचार? यदि आवश्यक हो तो मैं भी scipy/numpy का उपयोग कर सकते हैं।

उत्तर

15
dict((k, mydict[k]) for k in keys_to_select) 

आप सभी चाबियाँ mydict में भी चाबियाँ हैं का चयन करने के पता है; यदि यह मामला नहीं है,

dict((k, mydict[k]) for k in keys_to_select if k in mydict) 
+1

का उपयोग करते समय "यदि mydict में कश्मीर" इस ​​तरह, अजगर एक has_key प्रकार लुकअप होता है या वह में एक सूची/iterable और उन पर पाश कुंजी परिवर्तित करता है? यदि यह बाद वाला है, "अगर mydict.has_key (k)" अधिक कुशल हो सकता है, नहीं? (अभी तक, किसी भी तरह से स्पष्टीकरण के लिए कोई दस्तावेज नहीं मिला है। Google कौशल मुझे विफल कर दिया है)। – pycruft

+1

मेरे प्रश्न का उत्तर देने के लिए, "k in dict" का उपयोग करके "dict.has_key (k)" का उपयोग करने के समान है http://www.python.org/dev/peps/pep-0234/ – pycruft

+2

@pycruft, yep , और, 'टाइमिट' सीकएन पुष्टि के रूप में ('python -mtimeit -s'd = dict.fromkeys (रेंज (99)) ''23 इन डी' आदि), वास्तव में, वास्तव में, लगभग दोगुनी है 'has_key' के रूप में (हर बार एक नाम-विशेषता लुकअप बचाता है, जो एक नियम लूलअप के समान ऑपरेशन के बारे में है)। 'Has_key' का उपयोग करने का कोई कारण नहीं है, और इसे पायथन 3 से हटा दिया गया है। –