मुझे मिल गया है dictकि प्रविष्टियों का एक पूरा गुच्छा है। मुझे उनमें से कुछ चुनिंदा लोगों में ही दिलचस्पी है। क्या अन्य लोगों को बाहर निकालने का एक आसान तरीका है?
मुझे मिल गया है dictकि प्रविष्टियों का एक पूरा गुच्छा है। मुझे उनमें से कुछ चुनिंदा लोगों में ही दिलचस्पी है। क्या अन्य लोगों को बाहर निकालने का एक आसान तरीका है?
जवाबों:
एक नए तानाशाह का निर्माण:
dict_you_want = { your_key: old_dict[your_key] for your_key in your_keys }
शब्दकोश समझ का उपयोग करता है।
यदि आप एक ऐसे संस्करण का उपयोग करते हैं, जिसमें उनकी कमी है (अर्थात पायथन 2.6 और पूर्व में), तो इसे बनाएं dict((your_key, old_dict[your_key]) for ...)। यह वही है, हालांकि बदसूरत है।
ध्यान दें कि यह, jnnnnn के संस्करण के विपरीत, old_dictकिसी भी आकार के लिए स्थिर प्रदर्शन (केवल आपके_की संख्या पर निर्भर करता है) है । गति और स्मृति दोनों के संदर्भ में। चूंकि यह एक जनरेटर अभिव्यक्ति है, यह एक समय में एक आइटम को संसाधित करता है, और यह old_dict के सभी आइटमों के माध्यम से नहीं दिखता है।
जगह में सब कुछ हटाना:
unwanted = set(keys) - set(your_dict)
for unwanted_key in unwanted: del your_dict[unwanted_key]
old_dictकहीं और बग को इंगित करने के लिए गायब है, और उस स्थिति में मैं चुपचाप गलत परिणामों के लिए एक त्रुटि पसंद करता हूं।
थोड़ा और अधिक सुरुचिपूर्ण तानाशाही:
foodict = {k: v for k, v in mydict.items() if k.startswith('foo')}
mydict.iteritems()इसके बजाय इस्तेमाल करते हैं तो शायद वही सिद्ध होगा । .items()एक और सूची बनाता है।
यहाँ अजगर 2.6 में एक उदाहरण है:
>>> a = {1:1, 2:2, 3:3}
>>> dict((key,value) for key, value in a.iteritems() if key == 1)
{1: 1}
फ़िल्टरिंग भाग ifकथन है।
यह विधि डेलान के उत्तर की तुलना में धीमी है यदि आप केवल बहुत सी चाबियों में से कुछ का चयन करना चाहते हैं।
if key in ('x','y','z')अनुमान लगाता हूँ।
कोड 1:
dict = { key: key * 10 for key in range(0, 100) }
d1 = {}
for key, value in dict.items():
if key % 2 == 0:
d1[key] = value
कोड 2:
dict = { key: key * 10 for key in range(0, 100) }
d2 = {key: value for key, value in dict.items() if key % 2 == 0}
कोड 3:
dict = { key: key * 10 for key in range(0, 100) }
d3 = { key: dict[key] for key in dict.keys() if key % 2 == 0}
कोड प्रदर्शन के सभी pieced को संख्या = 1000 का उपयोग करके समयसीमा के साथ मापा जाता है, और कोड के प्रत्येक टुकड़े के लिए 1000 बार एकत्र किया जाता है।
अजगर 3.6 के लिए फिल्टर हुक कुंजी के तीन तरीकों का प्रदर्शन लगभग समान है। अजगर के लिए 2.7 कोड 3 थोड़ा तेज है।
यह एक लाइनर लैम्बडा काम करना चाहिए:
dictfilt = lambda x, y: dict([ (i,x[i]) for i in x if i in set(y) ])
यहाँ एक उदाहरण है:
my_dict = {"a":1,"b":2,"c":3,"d":4}
wanted_keys = ("c","d")
# run it
In [10]: dictfilt(my_dict, wanted_keys)
Out[10]: {'c': 3, 'd': 4}
यह एक मूल सूची है जो आपकी तानाशाही कुंजी (i x) पर निर्भर करती है और यदि आपकी इच्छित कुंजी सूची (y) में रहती है तो tuple (कुंजी, मान) जोड़े की सूची को आउटपुट करती है। एक तानाशाह () पूरी चीज को आउटपुट के रूप में लपेटता है।
setलिए उपयोग करना चाहिए wanted_keys, लेकिन अन्यथा अच्छा लग रहा है।
dictfilt({'x':['wefwef',52],'y':['iuefiuef','efefij'],'z':['oiejf','iejf']}, ('x','z'))तो यह {'x': ['wefwef', 52], 'z': ['oiejf', 'iejf']}इरादा के अनुसार लौटता है ।
dict={'0':[1,3], '1':[0,2,4], '2':[1,4]}और परिणाम यह था {}, जिसे मैंने एक रिक्त तानाशाही माना।
foo = {'0':[1,3], '1':[0,2,4], '2':[1,4]}; dictfilt(foo,('0','2'))मुझे मिलता है: {'0': [1, 3], '2': [1, 4]}जो अभीष्ट परिणाम है
आपके मूल शब्दकोश origऔर प्रविष्टियों के सेट को देखते हुए, जिनमें आप रुचि रखते हैं keys:
filtered = dict(zip(keys, [orig[k] for k in keys]))
जो डेलान के उत्तर के रूप में अच्छा नहीं है, लेकिन ब्याज के हर पायथन संस्करण में काम करना चाहिए। हालांकि, यह keysआपके मूल शब्दकोश में मौजूदा के प्रत्येक तत्व के लिए नाजुक है ।
डेलान द्वारा स्वीकार किए गए उत्तर के आधार पर।
क्या होगा यदि आपकी एक वांछित कुंजी Old_dict में नहीं है? डेलान समाधान एक KeyError अपवाद को फेंक देगा जिसे आप पकड़ सकते हैं। यदि ऐसा नहीं है जो आपको चाहिए तो शायद आप चाहते हैं:
केवल उन कुंजियों को शामिल करें जो पुराने_दोनों में और आपके चाहने वालों के समूह को उत्तेजित करती हैं।
old_dict = {'name':"Foobar", 'baz':42}
wanted_keys = ['name', 'age']
new_dict = {k: old_dict[k] for k in set(wanted_keys) & set(old_dict.keys())}
>>> new_dict
{'name': 'Foobar'}उन कुंजियों के लिए एक डिफ़ॉल्ट मान है जो पुराने_डिक्ट में सेट नहीं हैं।
default = None
new_dict = {k: old_dict[k] if k in old_dict else default for k in wanted_keys}
>>> new_dict
{'age': None, 'name': 'Foobar'}{k: old_dict.get(k, default) for k in ...}
यह कार्य करेगा चाल:
def include_keys(dictionary, keys):
"""Filters a dict by only including certain keys."""
key_set = set(keys) & set(dictionary.keys())
return {key: dictionary[key] for key in key_set}
डेलान के संस्करण की तरह, यह एक शब्दकोश समझ का उपयोग करता है और इसमें बड़े शब्दकोशों के लिए स्थिर प्रदर्शन होता है (केवल आपके द्वारा अनुमत कुंजी की संख्या पर निर्भर करता है, और शब्दकोश में कुंजियों की कुल संख्या नहीं)।
और MyGGan के संस्करण की तरह, यह आपकी कुंजी को सूची में शामिल करने की अनुमति देता है जो कि शब्दकोश में मौजूद नहीं हो सकता है।
और एक बोनस के रूप में, यहाँ उलटा है, जहाँ आप मूल में कुछ कुंजियों को छोड़कर एक शब्दकोश बना सकते हैं:
def exclude_keys(dictionary, keys):
"""Filters a dict by excluding certain keys."""
key_set = set(dictionary.keys()) - set(keys)
return {key: dictionary[key] for key in key_set}
ध्यान दें कि डेलन के संस्करण के विपरीत, ऑपरेशन जगह में नहीं किया गया है, इसलिए प्रदर्शन शब्दकोश में कुंजी की संख्या से संबंधित है। हालांकि, इसका लाभ यह है कि फ़ंक्शन प्रदान किए गए शब्दकोश को संशोधित नहीं करेगा।
संपादित करें: कुछ कुंजियों को एक तानाशाह से बाहर करने के लिए एक अलग फ़ंक्शन जोड़ा गया।
invertइसका मतलब यह है कि keysतर्क रखा जाता है, या यह keysतर्क खारिज कर दिया जाता है?", उनमें से कितने सहमत होंगे?
यदि हम हटाए गए चयनित कुंजी के साथ एक नया शब्दकोश बनाना चाहते हैं, तो हम
उदाहरण के लिए शब्दकोश समझ का उपयोग कर सकते हैं :
d = {
'a' : 1,
'b' : 2,
'c' : 3
}
x = {key:d[key] for key in d.keys() - {'c', 'e'}} # Python 3
y = {key:d[key] for key in set(d.keys()) - {'c', 'e'}} # Python 2.*
# x is {'a': 1, 'b': 2}
# y is {'a': 1, 'b': 2}
एक अन्य विकल्प:
content = dict(k1='foo', k2='nope', k3='bar')
selection = ['k1', 'k3']
filtered = filter(lambda i: i[0] in selection, content.items())
लेकिन आपको एक list(पायथन 2) या एक पुनरावृत्ति करने वाला (पायथन 3) मिलता है filter(), नहीं dict।
filteredमें dictऔर आप शब्दकोश वापस मिल!
यहाँ delएक लाइनर का उपयोग करते हुए एक और सरल विधि है :
for key in e_keys: del your_dict[key]
e_keysबाहर रखी जाने वाली चाबियों की सूची है। यह आपको एक नया देने के बजाय आपके आदेश को अद्यतन करेगा।
यदि आप एक नया आउटपुट तानाशाही चाहते हैं, तो हटाने से पहले तानाशाह की एक प्रति बनाएं:
new_dict = your_dict.copy() #Making copy of dict
for key in e_keys: del new_dict[key]
आप उपयोग कर सकते हैं python-benedict, यह एक तानाशाही उपवर्ग है।
स्थापना: pip install python-benedict
from benedict import benedict
dict_you_want = benedict(your_dict).subset(keys=['firstname', 'lastname', 'email'])
यह GitHub पर खुला-स्रोत है: https://github.com/fabiocaccamo/python-benedict
अस्वीकरण: मैं इस पुस्तकालय का लेखक हूं।