[英]Remove matching items in a list
抱歉,如果這是一個重復的問題,我進行了搜索,但找不到任何幫助。
我目前正在嘗試比較兩個列表。 如果有任何匹配的項目,我將從列表之一中將其全部刪除。
但是我得到的結果是越野車。 這是我使用的方法的粗略但准確的表示:
>>> i = [1,2,3,4,5,6,7,8,9]
>>> a = i
>>> c = a
>>> for b in c:
if b in i:
a.remove(b)
>>> a
[2, 4, 6, 8]
>>> c
[2, 4, 6, 8]
因此,我意識到主要的問題是,當我刪除項目時,它會縮短列表,因此Python然后跳過了中間項目(非常煩人)。 結果,我列出了第三個列表,作為可以循環的中間對象。
真正令我感到困惑的是,即使我沒有直接要求它,這份名單似乎也在改變!
最簡單的方法是使用set
來確定a
和 b
共享項:
for x in set(a).intersection(b):
a.remove(x)
a = i
不復制列表,它只是設置另一個變量, i
指向您的列表a
。 嘗試這樣的事情:
>>> i = [1, 2, 3, 2, 5, 6]
>>> s = []
>>> for i in t:
if i not in s:
s.append(i)
>>> s
[1, 2, 3, 5, 6]
您還可以使用set
來保證不重復,但不保留順序 :
list(set(i))
您的語句a = i
和c = a
僅使引用相同對象的新名稱成為可能。 然后,當您從a
刪除對象時,它們也會從b
和i
刪除,因為它們是同一對象。 您將需要復制列表,就像這樣
a = i[:]
c = a[:]
在python中,當您編寫此代碼時:
i = [1,2,3,4,5,6,7,8,9]
您創建一個對象(在本例中為列表),並將其分配給名稱 i
。 您的下一行a = i
告訴解釋器, 名稱 a
指向相同的Object。 如果希望它們是單獨的對象,則需要復制原始列表。 您可以通過切片速記i[:]
來做到這一點,也可以使用a = list(i)
使其更明確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.