2012-10-18 115 views
4

我有一個列表,我試圖刪除其中有'pie'的元素。這就是我所做的。在列表元素中搜索子字符串刪除元素(Python)

['applepie','orangepie', 'turkeycake'] 
for i in range(len(list)): 
    if "pie" in list[i]: 
     del list[i] 

我不斷收到列表索引超出範圍,但是當我將del改爲打印語句時,它打印出的元素很好。

+0

如果「pie」始終處於末尾,則可以使用字符串的endswith方法。如果這是你想要做的,它會更有效率(對於長字符串,對於短字符串它幾乎是相同的)並且更清楚。 (在旁註:也存在'startswith')。 – Bakuriu

回答

1

爲什麼出現錯誤的原因是因爲您在刪除某些東西時更改了列表的長度!

例子:

first loop: i = 0, length of list will become 1 less because you delete "applepie" (length is now 2) 
second loop: i = 1, length of list will now become just 1 because we delete "orangepie" 
last/third loop: i = 2, Now you should see the problem, since i = 2 and the length of the list is only 1 (to clarify only list[0] have something in it!). 

因此,而使用這樣的:

for item in in list: 
    if "pie" not in item: 
     new list.append(item) 
2

刪除元素的迭代過程中,改變了大小,從而導致IndexError。

你可以重寫你的代碼(使用列表綜合)

L = [e for e in L if "pie" not in e] 
0

另一個但更長的方法是記下,你遇到的餡餅索引和刪除後的第一個這些元素的循環

+0

您仍有同樣的問題 - 除非您按相反順序刪除元素。但是這仍然沒有效率,因爲刪除一個元素意味着所有後面的元素都必須每次都被洗牌。創建一個新列表非常有效,您不會複製元素,只需創建額外的引用即可。 –

+0

好點。同意 –

6

而不是從列表中刪除一個項目你遍歷,嘗試用Python創建的漂亮list comprehension syntax一個新的列表:

foods = ['applepie','orangepie', 'turkeycake'] 
pieless_foods = [f for f in foods if 'pie' not in f] 
+0

'食品= ['applepie','orangepie','turkeycake'] pie_foods = [f for f'if'pie'not in f]' (不確定'不在'是不是語法 –

+0

@AJ。謝謝,感覺錯了 - 我糾正了這個問題 –

+0

非常短而緊湊的答案。將是最簡單的解決方案 –

2

喜歡的東西:

stuff = ['applepie','orangepie', 'turkeycake'] 
stuff = [item for item in stuff if not item.endswith('pie')] 

修改正在迭代的對象應被視爲禁止。