2014-12-20 9 views
5

साथ dict के माध्यम से पुनरावृत्ति की संगत तरह से मैं निम्न सूची समझ है कि केवल iteritems() के उपयोग के कारण अजगर 2 में काम करता है:अजगर 2 और 3 कुंजी और मान

foo = [key for key, value in some_dict.iteritems() if value['marked']] 

मैं किसी भी पुस्तकालयों आयात नहीं कर सकते। क्या यह पाइथन 2 और 3 दोनों पर संगत बनाने का एक साफ तरीका है?

उत्तर

7

आप बस दोनों अजगर 2 और 3 में dict.items() उपयोग कर सकते हैं,

foo = [key for key, value in some_dict.items() if value['marked']] 

या आप बस इस

def get_items(dict_object): 
    for key in dict_object: 
     yield key, dict_object[key] 

तरह items जनरेटर के अपने स्वयं के संस्करण, रोल और फिर इस तरह उपयोग कर सकते हैं

for key, value in get_items({1: 2, 3: 4}): 
    print key, value 
5

सबसे आसान तरीका सूची की परवाह नहीं करना है कितना बड़ा some_dict हो जाता है पर और अगर सब कुछ मदों के लिए सूची की रचना है

try: 
    # Python 2 
    iter_some_dict = some_dict.iteritems 
except AttributeError: 
    # Python 3 
    iter_some_dict = some_dict.items 

foo = [key for key, value in iter_some_dict if value['marked']] 

क्या आप उपयोग निर्भर करता है:

foo = [key for key, value in some_dict.items() if value['marked']] 

अगला विकल्प अपवाद संचालक उपयोग करने के लिए है: बस dict.items() उपयोग करके बनाया प्रदर्शन और आपके स्मृति उपयोग पर एक बड़ा प्रभाव होने जा रहा है। इसे निर्धारित करने के लिए आपको अपने सटीक उपयोग-मामले को बेंचमार्क करना होगा।

2

परिभाषित करें अपनी खुद की iteritems:

from future.utils import viewitems 

foo = [key for key, value in viewitems(some_dict) if value.get('marked')] 

:

iteritems = lambda d: (getattr(d, 'iteritems') or d.items)() 

foo = [key for key, value in iteritems(some_dict) if value['marked']] 
6

मैं कहूंगा कि अपनी खुद की, कई सामान को लागू करने को पहले से ही न्यूनतम/अनुकूलित तरह से आप के लिए किया जाता है की तुलना में future मॉड्यूल का उपयोग करने के लिए बेहतर है यदि आप उत्सुक हैं कि यह viewitems() काम कर रहा है, तो यह निम्नानुसार है:

def viewitems(obj, **kwargs): 
    """ 
    Function for iterating over dictionary items with the same set-like 
    behaviour on Py2.7 as on Py3. 

    Passes kwargs to method.""" 
    func = getattr(obj, "viewitems", None) 
    if not func: 
     func = obj.items 
    return func(**kwargs) 

एनबी: अगर 2.7 से पहले अजगर संस्करणों के साथ संगतता आवश्यक तो आप iteritems() का उपयोग करना चाहिए है:

from future.utils import iteritems 

foo = [key for key, value in iteritems(some_dict) if value.get('marked')] 
संबंधित मुद्दे