我有一個可以有重複的元素正整數的兩個排序名單,我必須消除對匹配的數字,從每個列表:刪除常見的元素在兩個列表
a=[1,2,2,2,3]
b=[2,3,4,5,5]
應該變成:
a=[1,2,2]
b=[4,5,5]
也就是說,2的和3分的,因爲它們同時出現在列表中已被刪除。
交集不能在此處使用,因爲重複元素。
我該如何解決這個問題?
我有一個可以有重複的元素正整數的兩個排序名單,我必須消除對匹配的數字,從每個列表:刪除常見的元素在兩個列表
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,但創建沒有公共元素的副本。
從集合反對象可以做到這一點相當簡潔:
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做得很好。這是一個乾淨而快速的解決方案。 –
鑑於該列表進行排序,你可以合併/分佈元素明智的,例如:
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
我試過了 - 但看不到輸入和輸出之間的連接。這可能是一些更多的例子/進一步的解釋會有所幫助... –
我認爲這是因爲3應該已經從兩個列表中刪除以及其中一個 – nrussell
我知道重疊補丁應該從兩個序列中刪除序列對齊。正確??? –