2015-06-10 34 views
1

我有一個字符串stringlist = ["elementOne" , "elementTwo" , "elementThree"]的名單,我想搜索包含"Two"串並刪除從列表中的元素,所以我的列表將成爲stringlist = ["elementOne" , "elementThree"]查找並刪除列表中的元素,如果匹配的字符串

我管理打印他們,但真的不知道如何使用del,因爲我不知道該索引列表或使用stringlist.remove("elementTwo")完全刪除,因爲我不知道含"Two"

我的代碼元素的確切字符串到目前爲止:

for x in stringlist: 
    if "Two" in x: 
     print(x) 

回答

1

通常,當我們執行列表理解,我們建立了一個新的列表,並分配給它的同名遺憾作爲舊名單。雖然這會得到期望的結果,但這不會刪除舊的列表。

爲了確保引用保持不變,則必須使用此:

>>> stringlist[:] = [x for x in stringlist if "Two" not in x] 
>>> stringlist 
['elementOne', 'elementThree'] 

優點:既然是分配給一個列表切片
將具有相同的內容替換Python列表對象,所以引用保持不變,從而防止其他地方引用的一些錯誤。

如果你這樣做,你會失去對原始列表的引用。

>>> stringlist = [x for x in stringlist if "Two" not in x] 
>>> stringlist 
['elementOne', 'elementThree'] 

因此,爲了保留引用,您需要構建列表對象併爲其分配列表片段。

要了解的細微差別:

讓我們以一個列表a1包含一些元素,並指定列表a2等於a1

>>> a1 = [1,2,3,4] 
>>> a2 = a1 

方法1:

>>> a1 = [x for x in a1 if x<2] 

>>> a1 
[1] 
>>> a2 
[1,2,3,4] 

方法2:

>>> a1[:] = [x for x in a1 if x<2] 

>>> a1 
[1] 
>>> a2 
[1] 

方法-2其實是將原來的a1列表,而方法-1確實的內容不。

1

您可以使用enumerate當你遍歷列表以獲得指數(但請注意,這不是修改列表在遍歷它一個Python的和安全的方式):

>>> for i,x in enumerate(stringlist): 
... if "Two" in x: 
...  print(x) 
...  del stringlist[i] 
... 
elementTwo 
>>> stringlist 
['elementOne', 'elementThree'] 

但作爲你可以用一個列表理解保留不適用的元素更優雅和Python的方式包含Two

>>> stringlist = [i for i in stringlist if not "Two" in i] 
>>> stringlist 
['elementOne', 'elementThree'] 
+1

通常修改正在迭代的列表是個不錯的主意。這是不同的,因爲你使用枚舉()? –

+0

@TimCastelijns好的,你注意到了這一點,是的,它實際上並不安全,並且它沒有任何區別,使用'enumerate'或不! – Kasramvd

0

這樣做會幫助你

for i,x in enumerate(stringlist): 
    if "Two" in x: 
     del stringlist[i] 

newList = [] 
for x in stringlist: 
    if "Two" in x: 
     continue 
    else 
     newList.append(x) 
-1

嗯,這是非常簡單 - 所有的麻煩

for x in stringlist: 
    if "Two" in x: 
     stringlist.remove(x) 
+1

不要這樣做。修改正在迭代的列表會產生奇怪的結果和錯誤 –

+0

你說得對,我已經在2k元素列表上做了這件事,發現即使它刪除了大部分包含「Two」字符串的元素,我仍然發現4個元素「不知何故」跳過了刪除。仍試圖找出最佳解決方案。我會及時向大家發佈。謝謝! – faceoff

相關問題