簡體   English   中英

刪除兩個列表中的公共元素

[英]Removing common elements in two lists

我有兩個正整數的排序列表,可以有重復的元素,我必須刪除匹配的數字對,每個列表一個:

a=[1,2,2,2,3]
b=[2,3,4,5,5]

應成為:

a=[1,2,2]
b=[4,5,5]

也就是說,2和3已被刪除,因為它們出現在兩個列表中。

由於重復的元素,此處不能使用集合交集。

我該怎么做?

要刪除兩個列表中出現的元素,請使用以下命令:

for i in a[:]:
    if i in b:
        a.remove(i)
        b.remove(i)

要創建一個為您完成的功能,只需執行以下操作:

def removeCommonElements(a, b):
    for e in a[:]:
        if e in b:
            a.remove(e)
            b.remove(e)

或者返回新列表而不是編輯舊列表:

def getWithoutCommonElements(a, b): # Name subject to change
    a2 = a.copy()
    b2 = b.copy()
    for e in a:
        if e not in b:
            a2.remove(e)
            b2.remove(e)
    return a2, b2

但是前者可以替換為removeCommonElements如下所示:

a2, b2 = a.copy(), b.copy()
removeCommonElements(a2, b2)

哪個會保留a和b,但是創建沒有共同元素的重復項。

集合中的Counter對象可以非常簡潔地完成:

from collections import Counter
a=Counter([1,2,2,2,3])
b=Counter([2,3,4,5,5])
print list((a-b).elements())
print list((b-a).elements())

這個想法是:

  1. 計算每個元素出現的頻率(例如,2中出現3次,b中出現1次)
  2. 減去計數以計算元素出現的額外次數(例如,2比b顯示3-1 = 2倍)
  3. 輸出每個元素它出現的額外次數(collections元素方法自動刪除任何小於1的元素)

(警告:輸出列表不一定要排序)

鑒於列表已排序,您可以合並/分發元素,例如:

x, y = [], []

while a and b:
    if a[0] < b[0]:
        x.append(a.pop(0))
    elif a[0] > b[0]:
        y.append(b.pop(0))
    else: # a[0]==b[0]
        a.pop(0)
        b.pop(0)

x += a
y += b

@Mahi給出的解決方案幾乎是正確的。 實現您想要的最簡單方法是:

def remove_common_elements(a, b):
    for i in a[:]:
        if i in b:
            a.remove(i)
            b.remove(i)
     return a, b

這里重要的是通過寫a[:]來復制a 如果在從列表中刪除元素的同時迭代列表,則無法獲得正確的結果。

如果您不想修改列表,請事先復制兩個列表並返回復制的列表。

def remove_common_elements(a, b):
    a_new = a[:]
    b_new = b[:]
    for i in a:
        if i in b_new:
            a_new.remove(i)
            b_new.remove(i)
    return a_new, b_new

一種解決方案是創建a的新副本並從b中刪除公共元素。

a = [1,2,2,2,3]
b = [2,2,3,4,5]

a_new = []
for ai in a:
    if ai in b:
        b.remove(ai)
    else:
        a_new.append(ai)

print a_new
print b

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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