簡體   English   中英

刪除列表中的匹配項

[英]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 = ic = a僅使引用相同對象的新名稱成為可能。 然后,當您從a刪除對象時,它們也會從bi刪除,因為它們是同一對象。 您將需要復制列表,就像這樣

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM