2013-01-11 76 views
4

我有一個可以有重複的元素正整數的兩個排序名單,我必須消除對匹配的數字,從每個列表:刪除常見的元素在兩個列表

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

應該變成:

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

也就是說,2的和3分的,因爲它們同時出現在列表中已被刪除。

交集不能在此處使用,因爲重複元素。

我該如何解決這個問題?

+1

我試過了 - 但看不到輸入和輸出之間的連接。這可能是一些更多的例子/進一步的解釋會有所幫助... –

+1

我認爲這是因爲3應該已經從兩個列表中刪除以及其中一個 – nrussell

+0

我知道重疊補丁應該從兩個序列中刪除序列對齊。正確??? –

回答

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,但創建沒有公共元素的副本。

+0

這不適用於列表'a = [1,2,2,2,3]'和'b = [2,2,3,4,5]',它會離開a = [1,2 ,3]','b = [3,4,5]'。 – nrussell

+1

不要遍歷列表,同時從中刪除元素。用'a [:]'替換'iter(a)',它就可以工作。 – pemistahl

+0

不是我所需要的:[1,1,3],[1,1,1]返回[1,3],[1,1],應該返回[3],[1],因爲有兩個匹配的1 –

2

從集合反對象可以做到這一點相當簡潔:

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次,1時間b)
  2. 減去計數以計算元素出現多少次(例如,2出現3-1 = a比b多出2倍)
  3. 輸出每個元素的額外數字的時候,它出現(集合元素的方法將自動刪除計數小於1的任何元素)

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

+0

+1做得很好。這是一個乾淨而快速的解決方案。 –

2

鑑於該列表進行排序,你可以合併/分佈元素明智的,例如:

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 
1

@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 
0

一種解決方案是創建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 
相關問題