त्रुटि: "'तानाशाह' वस्तु में कोई विशेषता नहीं है 'पुनरावृत्तियों'"


436

मैं एक आकृति को पढ़ने के लिए NetworkX का उपयोग करने की कोशिश कर रहा हूं और शेपफाइल्स को write_shp()उत्पन्न करने के लिए फ़ंक्शन का उपयोग करता हूं जिसमें नोड्स और किनारे होंगे, लेकिन जब मैं कोड को चलाने की कोशिश करता हूं तो यह मुझे निम्न त्रुटि देता है:

Traceback (most recent call last):   File
"C:/Users/Felipe/PycharmProjects/untitled/asdf.py", line 4, in
<module>
    nx.write_shp(redVial, "shapefiles")   File "C:\Python34\lib\site-packages\networkx\readwrite\nx_shp.py", line
192, in write_shp
    for key, data in e[2].iteritems(): AttributeError: 'dict' object has no attribute 'iteritems'

मैं पाइथन 3.4 का उपयोग कर रहा हूं और पाइप स्थापित के माध्यम से नेटवर्कएक्स को स्थापित किया है।

इस त्रुटि से पहले यह पहले से ही मुझे एक और एक है कि ने कहा कि "xrange मौजूद नहीं है" या ऐसा ही कुछ दिया था, तो मैं यह देखा और अभी-अभी बदली xrangeकरने के लिए rangenx_shp.py फ़ाइल है, जो इसे हल करने लग रहा था में।

मैंने जो पढ़ा है, वह पायथन संस्करण (पायथन 2 बनाम पायथन 3) से संबंधित हो सकता है।


231
अजगर 3 का नाम बदला dict.iteritems -> dict.items
ब्लेंडर

1
अरे वाह मुझे अभी बहुत मूर्खतापूर्ण लगता है, जवाब के लिए धन्यवाद
फ्रवरे

6
@ ब्लेंडर: नहीं, इसका नाम नहीं बदला iteritemsगया items। पूर्व ने आपको एक पुनरावृत्त दिया (और 3.x के पास ऐसी कोई विधि नहीं है); उत्तरार्द्ध आपको एक दृश्य देता है (जिसे 2.7 के रूप में बैकपोर्ट किया गया था viewitems)।
'23

2
शब्दकोश में संभव डुप्लिकेट , मान, शब्दकोश में आइटम काम नहीं करता है
Rogukasz Rogalski

यह ओपी को मूल रूप से जोड
नाथन आर्थर

जवाबों:


881

जैसा कि आप python3 में हैं, dict.items()इसके बजाय का उपयोग करेंdict.iteritems()

iteritems() python3 में हटा दिया गया था, इसलिए अब आप इस विधि का उपयोग नहीं कर सकते।

पायथन 3.0 विकी बिल्ट-इन चेंज सेक्शन पर एक नज़र डालें , जहाँ यह कहा गया है:

हटाया dict.iteritems(), dict.iterkeys()और, और dict.itervalues()

इसके बजाय: उपयोग dict.items(), dict.keys()और dict.values() क्रमशः।


इसकी और चर्चा आधिकारिक तौर पर पीईपी 469 में दर्ज की गई है । अनुशंसित दृष्टिकोण इसके बजाय iteritemsफ़ंक्शन future.utilsया sixमॉड्यूल के उपयोग के लिए प्रतीत होता है ।
मैक

33

में को Python2 , हम था .items()और .iteritems()शब्दकोशों में। dict.items()शब्दकोश में tuples की सूची लौटा दी [(k1,v1),(k2,v2),...]। इसने सभी टुपल्स को शब्दकोश में कॉपी किया और नई सूची बनाई। यदि शब्दकोश बहुत बड़ा है, तो बहुत बड़ी स्मृति प्रभाव है।

इसलिए उन्होंने dict.iteritems()पायथन 2 के बाद के संस्करणों में बनाया। इससे पुनरावृति वस्तु वापस आ गई। संपूर्ण शब्दकोश की प्रतिलिपि नहीं बनाई गई थी, इसलिए स्मृति की खपत कम है। उपयोग करने वाले लोग Python2सिखाया जाता है का उपयोग करने के dict.iteritems()बजाय .items()के रूप में कोड निम्नलिखित में विस्तार से बताया दक्षता के लिए।

import timeit

d = {i:i*2 for i in xrange(10000000)}  
start = timeit.default_timer()
for key,value in d.items():
    tmp = key + value #do something like print
t1 = timeit.default_timer() - start

start = timeit.default_timer()
for key,value in d.iteritems():
    tmp = key + value
t2 = timeit.default_timer() - start

आउटपुट:

Time with d.items(): 9.04773592949
Time with d.iteritems(): 2.17707300186

में python3 , वे इसे और अधिक कुशल, इसलिए ले जाया बनाना चाहते थे dictionary.iteritems()करने के लिए dict.items(), और हटाया .iteritems()के रूप में यह अब जरूरत थी।

आपने उपयोग किया dict.iteritems()है Python3इसलिए यह विफल हो गया है। उपयोग करने का प्रयास करें dict.items()जिसकी कार्यक्षमता समान dict.iteritems()है Python2। यह एक छोटे से बिट माइग्रेशन इशू Python2है Python3


5

मुझे एक समान समस्या थी (3.5 का उपयोग करना) और एक दिन में 1/2 खो दिया था, लेकिन यहां कुछ ऐसा है जो काम करता है - मैं सेवानिवृत्त हूं और सिर्फ पायथन सीख रहा हूं ताकि मैं अपने पोते (12) की मदद कर सकूं।

mydict2={'Atlanta':78,'Macon':85,'Savannah':72}
maxval=(max(mydict2.values()))
print(maxval)
mykey=[key for key,value in mydict2.items()if value==maxval][0]
print(mykey)
YEILDS; 
85
Macon

5

Python2 में, Python3 की dictionary.iteritems()तुलना में अधिक कुशल है dictionary.items(), की कार्यक्षमता dictionary.iteritems()को माइग्रेट कर दिया गया है dictionary.items()और iteritems()हटा दिया गया है। तो आपको यह त्रुटि हो रही है।

dict.items()Python3 में उपयोग करें जो Python2 के समान है dict.iteritems()


-1

इसका उद्देश्य .iteritems()लूपिंग करते समय एक समय में एक परिणाम प्राप्त करके कम मेमोरी स्पेस का उपयोग करना था। मुझे यकीन नहीं है कि पायथन 3 संस्करण का समर्थन नहीं करता है, iteritems()हालांकि यह इससे अधिक कुशल साबित हुआ है.items()

यदि आप एक कोड शामिल करना चाहते हैं जो PY संस्करण 2 और 3 दोनों का समर्थन करता है,

try:
    iteritems
except NameError:
    iteritems = items

यह मदद कर सकता है यदि आप किसी अन्य सिस्टम में अपनी परियोजना को तैनात करते हैं और आप PY संस्करण के बारे में निश्चित नहीं हैं।


-1

जैसा कि राफेलसी द्वारा उत्तर दिया गया है, पायथन 3 का नाम बदलकर तानाशाही है -> तानाशाही। एक अलग पैकेज संस्करण का प्रयास करें। यह उपलब्ध पैकेजों की सूची देगा:

python -m pip install yourOwnPackageHere==

फिर संस्करण के साथ फिर से चलाएँ आप == के बाद संस्करण को स्थापित / स्विच करने की कोशिश करेंगे

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