पायथन मैप ऑब्जेक्ट सबस्क्रिप्टेबल नहीं है


83

निम्न स्क्रिप्ट त्रुटि क्यों देती है:

payIntList[i] = payIntList[i] + 1000
TypeError: 'map' object is not subscriptable

payList = []
numElements = 0

while True:
        payValue = raw_input("Enter the pay amount: ")
        numElements = numElements + 1
        payList.append(payValue)
        choice = raw_input("Do you wish to continue(y/n)?")
        if choice == 'n' or choice == 'N':
                         break

payIntList = map(int,payList)

for i in range(numElements):
         payIntList[i] = payIntList[i] + 1000
         print payIntList[i]

5
क्या आप पायथन 3 का उपयोग कर रहे हैं?
— फेलिक्स क्लिंग

@ user567797 - यह मेरे लिए ठीक काम करता है @ फेलिक्स: वह अजगर 3 का उपयोग नहीं कर रहा है क्योंकि वह एक बयान के रूप में प्रिंट का उपयोग कर रहा है!
— पुष्पक डगड़े

2
जबकि लूप के नीचे पूरी चीज को छोटा किया जा सकता है payIntList = [int(x) + 1000 for x in payList]; print(*payIntList, sep='\n')(या for x in payIntList: print xपायथन 2.x में, जहां printकोई फ़ंक्शन नहीं है) पठनीयता खोए बिना (यकीनन, यह और भी पठनीय है)।

2
@Guanidene: वह पायथन 3 का उपयोग कर रहा है, क्योंकि उसके पास मैप ऑब्जेक्ट्स हैं। लेकिन वह इस पर पायथन 2 कोड चलाने की कोशिश कर रहा है, इसलिए त्रुटियां।
— लेनार्ट रेगेब्र नोव

3
मुझे "पायथन 3 पर पायथन 2 कोड चलाने पर" मुझे गलतियां क्यों आती हैं, इस सवाल पर, हम इन सभी को डुप्लिकेट के रूप में चिह्नित कर सकते हैं। ;)
— लेनार्ट रेगेब्रो

जवाबों:


138

पायथन 3 में, mapएक प्रकार की पुनरावृत्ति योग्य वस्तु लौटाता है map, न कि एक उप-योग्य सूची, जो आपको लिखने की अनुमति देती है map[i]। सूची परिणाम को बाध्य करने के लिए, लिखें

payIntList = list(map(int,payList))

हालांकि, कई मामलों में, आप सूचकांकों का उपयोग नहीं करके अपने कोड तरीके को अच्छे से लिख सकते हैं। उदाहरण के लिए, सूची की समझ के साथ :

payIntList = [pi + 1000 for pi in payList]
for pi in payIntList:
    print(pi)

6
यह उत्तर सही है, लेकिन आदर्श रूप से आप इस तरह के उपयोग के मामलों के लिए नक्शे को सूचियों में परिवर्तित नहीं करेंगे। मैप्स पहले से ही चलने योग्य हैं, और सूचियों की तुलना में पुनरावृति करने के लिए तेजी से परिमाण का क्रम प्रतीत होता है। तो न केवल आपको एक सूचकांक की आवश्यकता नहीं है, आपको एक सूची की आवश्यकता नहीं है। क्लीनर कोड होगा, क्योंकि payIntList पहले से ही एक नक्शा है,for i in payIntList: print(i + 1000)
— RustyToms

17

map()कोई सूची नहीं लौटाता, यह एक mapवस्तु लौटाता है ।

list(map)यदि आप इसे फिर से एक सूची बनाना चाहते हैं तो आपको कॉल करने की आवश्यकता है ।

और भी बेहतर,

from itertools import imap
payIntList = list(imap(int, payList))

इंटरमीडिएट ऑब्जेक्ट बनाने के लिए मेमोरी का एक गुच्छा नहीं लेंगे, यह बस intsबाहर निकल जाएगा क्योंकि यह उन्हें बनाता है।

इसके अलावा, आप ऐसा कर सकते हैं if choice.lower() == 'n':ताकि आपको इसे दो बार न करना पड़े।

अजगर समर्थन करता है +=: आप कर सकते हैं payIntList[i] += 1000और numElements += 1यदि आप चाहते हैं।

यदि आप वास्तव में मुश्किल होना चाहते हैं:

from itertools import count
for numElements in count(1):
    payList.append(raw_input("Enter the pay amount: "))
    if raw_input("Do you wish to continue(y/n)?").lower() == 'n':
         break

और / या

for payInt in payIntList:
    payInt += 1000
    print payInt

इसके अलावा, चार स्थान पायथन में मानक इंडेंट राशि है।


1
वैसे यह python3 के लिए मामला है, लेकिन यहां वह python2.x का उपयोग कर रहा है क्योंकि वह एक बयान के रूप में प्रिंट का उपयोग कर रहा है।
— पुष्पक डगड़े

आपका कोड स्निपेट मेमोरी में सभी इन्ट्स को एक सूची में संग्रहीत करता है । पुनरावृत्तियों का उपयोग करना वास्तव में उपयोगी है और स्मृति को बचाता है, विशेष रूप से परिवर्तनों की कई परतों के साथ, लेकिन listएक इटरेटर के आसपास जोड़ने से वह लाभ दूर हो जाता है!

1
जब आप list(map(...))इसे बनाते हैं map, तब एक बनाता है list, फिर हटाता है map, इसलिए थोड़ी देर के लिए दोनों एक ही बार में स्मृति में होते हैं। जब आप ऐसा करते हैं तो list(imap(...))ऐसा नहीं होता है। इसलिए मैंने कहा " इंटरमीडिएट ऑब्जेक्ट के साथ मेमोरी ले लो "
— agf

तो आप पायथन 2 मान रहे हैं? फिर list(map(...))निरर्थक है, क्योंकि - जैसा कि प्रलेखन में कहा गया है, "परिणाम [की map] हमेशा एक सूची है"।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.