2012-02-18 19 views
5

से विशिष्ट कुंजी-मान जोड़ों युक्त एक अजगर शब्दकोश बनाएं मैं कुछ कोड है कि कुछ इस तरह दिखता है:एक और शब्दकोश

d = {'foo': True, 'bar': 42, 'baz': '!'} 

a = {'foo': d['foo'], 'bar': d['bar']} 
b = {'foo': d['foo'], 'baz': d['baz']} 
c = {'bar': d['bar'], 'baz': d['baz']} 

निश्चित रूप से इस व्यक्त करने के लिए एक बेहतर तरीका है। मैं वास्तव में इस उम्मीद में डॉक्स पढ़ा है कि एक शब्दकोश के copy विधि कुंजी नया शब्दकोश में शामिल किया जाना स्वीकार करता है:

# I'd hoped that something like this would work... 
a = d.copy('foo', 'bar') 
b = d.copy('foo', 'baz') 
c = d.copy('bar', 'baz') 

मैं इस उद्देश्य के लिए एक समारोह लिख सकते हैं:

copydict = lambda dct, *keys: {key: dct[key] for key in keys} 

a = copydict(d, 'foo', 'bar') 
b = copydict(d, 'foo', 'baz') 
c = copydict(d, 'bar', 'baz') 

कोई बेहतर है उपरोक्त से समाधान?

+0

आप बी, सी के लिए एक सूची (या एक सेट) का उपयोग क्यों नहीं करते? जब आपको इसकी ज़रूरत होती है तो आप ठंड को मूल्य में देखते हैं। – maxy

+0

मैं वास्तव में Django के 'urlencode' फ़ंक्शन (', 'urllib.urlencode' की तरह, एक शब्दकोश स्वीकार करता है) में 'ए',' बी', और 'c' गुजर रहा हूं। – davidchambers

+0

@BlaXpirit: आपको केवल "नंबर" वाला उत्तर लिखना चाहिए (एक HTML टिप्पणी के साथ न्यूनतम आकार के लिए पैड) ताकि हम सभी इसे पागलपन से वोट दे सकें। –

उत्तर

5

मुझे लगता है कि प्रश्न में कार्य सबसे अच्छा समाधान है।

बेशक, कोई कुछ बेवकूफ कोड पोस्ट कर सकता है, लेकिन मुझे यकीन है कि यह बेहतर/तेज़ काम नहीं करेगा। एक सूची में इटरेट करना और कुंजी द्वारा एक ताना से वस्तुओं को प्राप्त करना उतना तेज़ है जितना इसे प्राप्त हो सकता है।

एक सुझाव keys पैरामीटर से स्टार को निकालना है। तर्क अनपॅकिंग अनावश्यक ओवरहेड जोड़ता है। उन कुंजियों को टुपल के रूप में पास करने में कोई समस्या नहीं होनी चाहिए।

0

रूप @BlaXpirit से कहा, इस समाधान शायद गति या पठनीयता के संदर्भ में तुम्हारा की तुलना में बेहतर होने के लिए नहीं जा रहा है, लेकिन आप कुछ इस तरह कर सकता है:

>>> from operator import itemgetter 
>>> d = {'foo': True, 'bar': 42, 'baz': '!'} 
>>> keys = ['foo', 'bar'] 
>>> dict(zip(keys, itemgetter(*keys)(d))) 
{'bar': 42, 'foo': True} 
3

केवल सुधार मैं करूंगा बनाने के एक असली समारोह परिभाषा का उपयोग करने के लिए है, न कि एक लैम्ब्डा:

def copy_dict(d, *keys): 
    """Make a copy of only the `keys` from dictionary `d`.""" 
    return {key: d[key] for key in keys} 

यह कुंजियां अनुपलब्ध से निपटने के लिए उपयोगी हो सकता है, लेकिन अजगर 2 में आप अच्छी तरह से * args के साथ वैकल्पिक कीवर्ड तर्क मिश्रण नहीं कर सकते, तो आप हो सकता है एक tuple तर्क पर जाना है:

def copy_dict(d, keys, default=None): 
    """Make a copy of only the `keys` from dictionary `d`. 

    Use `default` if a key is missing. 

    """ 
    return {key: d.get(key, default) for key in keys} 
संबंधित मुद्दे