2011-05-25 163 views
21

我有一個預感,我需要訪問列表中的項目(字符串),修改該項目(作爲一個字符串),並將其放回列表中的相同指數python修改列表中的項目,保存回列表

我有困難得到一個項目回到相同的指數

for item in list: 
    if "foo" in item: 
     item = replace_all(item, replaceDictionary) 
     list[item] = item 
     print item 

現在我得到一個錯誤

TypeError: list indices must be integers, not str 

由於此行list[item] = item

這很有道理!但我不知道如何將該項目放回列表中使用python

這是什麼語法?理想情況下,for循環可以保證指數的跟蹤我目前在

+1

爲什麼你必須在列表中做到這一點?我最初的反應是使用列表理解: res = [replace_all(item,replaceDictionary)列表中的項目,如果'富'在項目] – krs1 2011-05-25 20:22:26

+0

這很狡猾,但這又如何不同? – CQM 2011-05-25 20:26:08

+0

我能看到的唯一問題是你試圖通過使用項目本身而不是項目的索引來引用列表項目。除此之外看起來很好。 另外,您在引用它之前修改了列表項。可能是字典的問題。 – krs1 2011-05-26 02:38:06

回答

33

你可以這樣做:

for idx, item in enumerate(list): 
    if 'foo' in item: 
     item = replace_all(...) 
     list[idx] = item 
+0

'ValueError:解包太多值了,我一直懷疑我的列表空間不夠用,有沒有辦法預先管理多少空間來進一步深入列表? (可能是一個新問題) – CQM 2011-05-25 20:11:30

+4

@RD:你確定你用過枚舉嗎? – 2011-05-25 20:12:47

+0

啊,沒注意到這個帖子。這似乎奏效了。雖然當我嘗試將它加入到一個字符串'listString =''.join(list)'中時,我又遇到了內存空間問題,但由於某種原因,它決定打印出它到控制檯有多遠,並且沒有完成程序的其餘部分 – CQM 2011-05-25 20:18:56

5

您需要使用枚舉函數:python docs

for place, item in enumerate(list): 
    if "foo" in item: 
     item = replace_all(item, replaceDictionary) 
     list[place] = item 
     print item 

而且,這是一個由於它是python中的保留字,所以使用單詞列表作爲變量是一個糟糕的主意。

既然你有沒有和羅列的問題,從itertools庫替代:

for place, item in itertools.zip(itertools.count(0), list): 
    if "foo" in item: 
     item = replace_all(item, replaceDictionary) 
     list[place] = item 
     print item 
2

一個常見成語更改列表中的每個元素看起來是這樣的:

for i in range(len(L)): 
    item = L[i] 
    # ... compute some result based on item ... 
    L[i] = result 

這可以被改寫使用枚舉()作爲:

for i, item in enumerate(L): 
    # ... compute some result based on item ... 
    L[i] = result 

請參閱enumerate