2015-05-14 192 views
0

我想替換列表l1中也在l2中的元素,並刪除不在l2中的元素。我不明白爲什麼以下解決方案不起作用:它返回Python將列表中的元素替換爲另一個列表中的列表,並刪除其他列表

[33, 33, 'd'] 

代替:

[33, 33, '33'] 

這裏是我的解決方案:

l1=['a','b','c', 'd'] 
l2= ['a','b','d','f'] 
for (i,wor) in enumerate(l1): 
    if wor in l2: 
     l1[i]= 33 
    else: 
     del l1[i] 
+0

什麼它不工作?這通常有助於看到嘗試解決問題。 –

回答

1

添加一些print電話,看看會發生什麼:

l1=['a','b','c', 'd'] 
l2= ['a','b','d','f'] 
for (i,wor) in enumerate(l1): 
    if wor in l2: 
     l1[i]= 33 
    else: 
     del l1[i] 
    print(i, len(l1)) 

打印:

0 4 
1 4 
2 3 

根據噸的索引一直要他原來是l1,但在迭代過程中更改了l1的大小。這弄亂了一切。你不應該這樣做。

1

使用一組存儲l2個元素,只是用33替換集合中的元素:

l1=['a','b','c', 'd'] 
l2= ['a','b','d','f'] 
st = set(l2) 
l1[:] = [33 for ele in l1 if ele in st] 
print(l1) 

您的代碼不起作用,因爲您正在從要迭代的列表中刪除元素。當你del l[i]你已經改變了列表的大小,所以l[i]最初不同於l[i]在刪除元素後指向的內容。你不應該從你正在迭代的列表中刪除元素,或者從你的輸出中看到錯誤的元素最終會被刪除。

如果你開始與你原來的列表:

l1=['a','b','c', 'd'] 
index 0 == a 
index 1 == b 
index 2 == c 
index 3 == d 

然後,如果你刪除c然後d是指數2所以你最終錯過d

你只需要前和刪除後添加打印:

for (i, wor) in enumerate(l1): 
    if wor in l2: 
     l1[i] = 33 
    else: 
     print(l1[i],l1) 
     del l1[i] 
     print(l1[i],l1) 

c [33, 33, 'c', 'd'] 
d [33, 33, 'd'] 

如果添加g到L1,你會看到一個比較明顯的錯誤:

l1=['a','b', "c", 'd',"g"] 
l2= ['a','b','d','f'] 

for (i, wor) in enumerate(l1): 
    if wor in l2: 
     l1[i] = 33 
    else: 
     print(l1[i],l1) 
     del l1[i] 
     print(l1[i],l1) 
print(l1) 

c [33, 33, 'c', 'd', 'g'] 
d [33, 33, 'd', 'g'] 
g [33, 33, 'd', 'g'] 
Traceback (most recent call last): 
    File 
    .......... 
    print(l1[i],l1) 
IndexError: list index out of range 

因爲你已經改變了大小不再是l[4]。你的代碼沒有錯誤,只是因爲l1的最後一個元素碰巧在l2中。

+0

我知道還有其他解決方案可行,但我想了解爲什麼我的解決方案失敗 – Mostafa

1

Padraic的解決方案似乎是要走的路,但是你明白你爲什麼會遇到問題,你正在修改當你執行del l1[i]步驟時迭代的列表。這將改變循環的下一次迭代中的所有索引,這將不可能做到你想要的。

1

爲什麼?因爲你迭代,並從相同的列表中刪除它不工作,l1

考慮迭代時wor = 'c'這裏i = 2

在這種迭代,因爲'c'沒有出現在列表中,您從列表,通過

l1 = [33, 33, 'd'],新的列表中刪除。

現在enumerate功能已經達到了它結束,因爲沒有更多的索引i=2後(如列表l1的長度得到了應有縮成刪除)

0

在您的代碼中,build_in函數del刪除了該列表中的特定值。因此,列表的當前大小減少了一個,即 3.因此循環結束。

這裏是一個示例代碼來區分方法:

l1=['a','b','c','d'] 
l2= ['a','b','d','f']  
i=0 
for wor in l1: 
    print wor 
    if wor in l2: 
     print 'id' 
     l1[i]= 33 
    else: 
     #del l1[i] 
     l1[i]='' 
     print 'del' 
    i+=1 


print l1 
print l2 

a

b

c

del

d

[33, 33, '', 33]

['a', 'b', 'd', 'f']

相關問題