2010-07-04 14 views
25

मैं लूप के लिए एक सूची में आइटम को संशोधित करने का प्रयास कर रहा हूं, लेकिन मुझे एक त्रुटि मिलती है (नीचे देखें)। नमूना कोड:लूप (पायथन) में सूची आइटमों का संशोधन

#!/usr/bin/env python 
# *-* coding: utf8 *-* 

data = [] 
data.append("some") 
data.append("example") 
data.append("data") 
data.append("here") 

for item in data: 
    data[item] = "everything" 

त्रुटि:

Traceback (most recent call last): 
    File "./testy.py", line 11, in <module> 
    data[item] = "everything" 
TypeError: list indices must be integers, not str 

वहाँ इस समस्या को हल करने के लिए कोई तरीका है?

उत्तर

57

बजाय इस प्रयास करें:

for i in xrange(len(data)): 
    data[i] = "everything" 

बुनियादी समस्या का उसका है कि जब आप data[i] लिखते हैं, data एक सूची होने के साथ, i जरूरतों एक पूर्णांक, सूची में एक संख्यात्मक सूचकांक होना है। लेकिन पाश में

for item in data 

item वास्तविक बात सूची में है कि, यानि कि एक स्ट्रिंग, नहीं बात के संख्यात्मक सूचकांक है। xrange एक पुनरावर्तक है जो सूची में मानों की बजाय संख्याएं उत्पन्न करता है, ताकि आप इसका उपयोग कर सकें।

एक वैकल्पिक होगा

for i, _ in enumerate(data): 
    data[i] = "everything" 

enumerate समारोह आप प्रपत्र (index, item) की tuples की पुनरावर्तक देता है, तो तुम सब करने की जरूरत है सूचकांक लेने के लिए और आइटम के बारे में भूल है। मुझे यकीन नहीं है कि एक तरफ या अन्य (enumerate या xrange) काफी तेज़ या बेहतर होगा, क्योंकि मुझे लगता है कि सूचियों में उनकी लंबाई एक चर में संग्रहित होती है ताकि इसे सूची तत्वों के माध्यम से गिनने के बिना तुरंत पहुंचा जा सके।

हालांकि, अगर आप पुरानी सूची मूल्य की जरूरत है नई सूची मूल्य की गणना करने, enumerate तरह से शायद थोड़ा तेज हो जाएगा क्योंकि आप अजगर सूची में तत्व को देखने के करने से बचने:

for i, item in enumerate(data): 
    data[i] = func(item) 

इस तरह

data = [func(item) for item in data] 

जब आप ऐसा करते हैं, अजगर प्रत्येक आइटम के माध्यम से data में है, इसलिए जाना यह करने के लिए समारोह लागू होते हैं, और स्वचालित रूप से परिणामों से एक नई सूची का निर्माण करेगी,: बात की बेहतर समझ के एक सूची है, हालांकि के रूप में व्यक्त किया जाता है y कहां सूची में सही जगह पर func(item) के परिणाम डालने के बारे में चिंता करने की ज़रूरत नहीं है। आपका मूल उदाहरण वास्तव में

data = ["everything" for item in data] 
+0

यह थोड़ा अजीब (या वैकल्पिक हल) है, लेकिन इसे सही ढंग से काम करता है। मुझे नहीं पता था कि ओवरराइडिंग आइटम (सूची में) को अपना आईडी दिया जाना चाहिए। धन्यवाद। –

+4

@sigo: यह वास्तव में एक कामकाज नहीं है, यह इस तरह के कार्य करने के लिए 100% सही और पूरी तरह से सामान्य तरीका है (लेकिन ध्यान दें कि मैंने सूची समझ के बारे में क्या कहा है)। –

+2

इस विशेष मामले में, सूची समझ को तेजी से 'डेटा = ["सब कुछ"] * लेन (डेटा)' द्वारा प्रतिस्थापित किया जा सकता है। – EOL

5

सूची आइटम को पूर्णांक अनुक्रमणिका द्वारा उपयोग किया जा सकता है, i। ई। आपके उदाहरण में data[1] == 'example'। यही कारण है कि जब आप लुकअप के रूप में स्ट्रिंग का उपयोग कर रहे हैं तो पाइथन शिकायत करता है।

आप अपने मूल्य से एक सूची में एक तत्व को खोजने के लिए चाहते हैं, आप data.index("value") उपयोग कर सकते हैं:

data[data.index("some")] = "something else" 

लेकिन अगर आप सिर्फ उन पर लूप करना चाहते हैं, enumerate() का उपयोग के रूप में डेविड का सुझाव दिया।

0

पूर्णांक का उपयोग कर सूची की अनुक्रमणिका अक्षम हो सकती है। यह संभावना है कि पाइथन स्टोर अंतर्निहित पॉइंटर्स के साथ लिंक्ड टेबल का उपयोग करके तत्वों को सूचीबद्ध करता है।इस मामले में, एक विशिष्ट आइटम खोजने के लिए, पायथन को i-th आइटम तक सूची को पार करना होगा।

यह सुझाव दिया है कि इस तरह प्रारूप का उपयोग कर कुशल हो सकता है: एक [:] = [x * x एक में एक्स के लिए]

संबंधित मुद्दे