आइटम () के बजाय पुनरावृत्तियों () का उपयोग कब किया जाना चाहिए?


153

क्या सभी स्थानों के items()बजाय इसका उपयोग करना वैध है iteritems()? iteritems()अजगर 3 से क्यों निकाला गया ? एक भयानक और उपयोगी विधि की तरह लगता है। इसके पीछे क्या तर्क है?

संपादित करें: स्पष्ट करने के लिए, मैं यह जानना चाहता हूं कि एक जनरेटर की तरह शब्दकोश में (एक समय में एक आइटम, सभी मेमोरी में नहीं) एक पायथन 2 और पायथन 3 दोनों के साथ संगत करने के लिए सही मुहावरे क्या हैं? ?

जवाबों:


148

पायथन 2.x में - .items()(कुंजी, मान) जोड़े की एक सूची लौटा दी। Python 3.x में, .items()अब एक itemviewवस्तु है, जो अलग-अलग व्यवहार करती है - इसलिए इसे iterated किया जाना चाहिए, या भौतिक रूप से ... तो, Python 2.x में list(dict.items())जो था , उसके लिए आवश्यक है dict.items()

पायथन 2.7 में भी कुंजी से निपटने के लिए बैक-पोर्ट का एक सा हिस्सा है, जिसमें आपके पास है viewkeys, viewitemsऔर viewvaluesविधियाँ, सबसे उपयोगी है viewkeysजो अधिक व्यवहार करती है जैसे कि set(जो आप से उम्मीद करेंगे dict)।

सरल उदाहरण:

common_keys = list(dict_a.viewkeys() & dict_b.viewkeys())

आपको सामान्य कुंजियों की एक सूची देगा, लेकिन फिर से, पायथन 3.x में - बस .keys()इसके बजाय उपयोग करें ।

पायथन 3.x को आम तौर पर अधिक "आलसी" बनाया गया है - यानी mapअब प्रभावी रूप से है itertools.imap, zipहै itertools.izip, आदि।


96

dict.iteritemsहटा दिया गया था क्योंकि dict.itemsअब चीज dict.iteritemsने अजगर में 2.x किया और यहां तक ​​कि इसे एक बनाकर इसे थोड़ा सुधार दिया itemview


64

छह पुस्तकालय लेखन कोड के साथ मदद करता है जो अजगर 2.5+ और अजगर 3 दोनों के साथ संगत है। इसमें एक पुनरावृत्त विधि है जो अजगर 2 और 3 में काम करेगी। उदाहरण:

import six

d = dict( foo=1, bar=2 )

for k, v in six.iteritems(d):
    print(k, v)

9

जैसा कि अजगर 2 और अजगर 3 के लिए शब्दकोश प्रलेखन आपको बताएगा, अजगर 2 में itemsएक सूची देता है, जबकि iteritemsएक पुनरावृत्ति देता है।

अजगर 3 में, itemsएक दृश्य लौटाता है , जो एक पुनरावृत्त के रूप में बहुत अधिक है।

यदि आप अजगर 2 का उपयोग कर रहे हैं, तो आप चाहते हैं कि iteritemsयदि आप बड़े शब्दकोशों के साथ काम कर रहे हैं और आप जो कुछ भी करना चाहते हैं, वह उपयोगकर्ता को आइटम्स पर पुनरावृत्त करना है (जरूरी नहीं कि उन्हें किसी सूची में कॉपी करें)


मैं समझता हूं कि iteritemsयह एक पुनरावृत्ति है, यही वजह है कि यह इतना उपयोगी है। मैं लगभग एक सूची के रूप में एक शब्दकोश पर पुनरावृति नहीं करना चाहता। तो क्या कुछ जनरेटर के साथ शब्दकोश पर पुनरावृति करने का सही तरीका है जैसे कि पायथन 2 और 3 दोनों के साथ संगत है?

3
@ user248237 for key in some_dictदोनों पर काम करता है - और 2to3उपकरण अनुवाद करेगा iteritems()करने के लिए items()वैसे भी ...
जॉन क्लेमेंट्स

1
@JonClements: काफी उचित, हालांकि मैंने हमेशा सोचा था for k in d: d[k]कि अनावश्यक रूप से वाचाल है /

6

बस के रूप में @Wessie बताया गया है, dict.iteritems, dict.iterkeysऔर dict.itervalues(जो एक वापसी इटरेटर Python2.x में) और साथ ही के रूप में dict.viewitems, dict.viewkeysऔर dict.viewvalues(जो वापसी दृश्य वस्तुओं Python2.x में) सभी Python3.x में हटा दिया गया है

और dict.items, dict.keysऔर dict.valuesएक वापस करने के लिए इस्तेमाल किया प्रतिलिपि अब Python2.x में शब्दकोश की सूची की वापसी दृश्य वस्तुओं Python3.x में, लेकिन वे अभी भी एक जैसे नहीं होते इटरेटर

आप एक वापसी चाहते हैं इटरेटर Python3.x में, का उपयोग iter(dictview):

$ python3.3

>>> d = {'one':'1', 'two':'2'}
>>> type(d.items())
<class 'dict_items'>
>>>
>>> type(d.keys())
<class 'dict_keys'>
>>>
>>>
>>> ii = iter(d.items())
>>> type(ii)
<class 'dict_itemiterator'>
>>>
>>> ik = iter(d.keys())
>>> type(ik)
<class 'dict_keyiterator'>

जब कोई उलटा लुकअप करना चाहता है तो कौन सा अधिक कुशल है? वस्तुओं या पुनरावृत्तियों को देखें?
लाइफबैलेंस

6

आप पायथन में सभी स्थानों के itemsबजाय उपयोग नहीं कर सकते iteritems। उदाहरण के लिए, निम्न कोड:

class C:
  def __init__(self, a):
    self.a = a
  def __iter__(self):
    return self.a.iteritems()

>>> c = C(dict(a=1, b=2, c=3))
>>> [v for v in c]
[('a', 1), ('c', 3), ('b', 2)]

यदि आप उपयोग करते हैं तो टूट जाएगा items:

class D:
  def __init__(self, a):
    self.a = a
  def __iter__(self):
    return self.a.items()

>>> d = D(dict(a=1, b=2, c=3))
>>> [v for v in d]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __iter__ returned non-iterator of type 'list'

दृश्य के लिए भी यही सच है , जो पायथन 3 में उपलब्ध है।

इसके अलावा, चूंकि आइटम(key, value) जोड़े की जोड़ी की सूची की एक प्रति लौटाते हैं , इसलिए यह कम कुशल है, जब तक कि आप किसी भी तरह एक प्रतिलिपि नहीं बनाना चाहते।

पायथन 2 में, iteritemsपुनरावृत्ति के लिए उपयोग करना सबसे अच्छा है । 2to3उपकरण के साथ यह जगह ले सकता है itemsअगर तुम कभी अजगर 3 में नवीनीकृत करने का फैसला।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.