2013-10-08 42 views
3

的我已經是我無法找到一個很好的回答了一個問題: 我要合併兩個列表,但保持相同數量的每個事件的對象 EX:蟒蛇 - 合併兩個列表,但保持相同數量出現

list1 = [2,3,7] 
list2 = [2,2,5] 

合併thees兩個列表後的結果應該是這樣的:

res = [2,2,3,5,7] #it does not need to be sorted 

觀察到,從一開始就出現了一起三「2」,但合併後,應該只有兩個「2」

我發現的最接近的是這篇文章:Combining two lists and removing duplicates, without removing duplicates in original list

但是這不符合我的要求。

的其他例子:

l1 = [2] 
l2 = [3] 
l3 = [2,2] 
l4 = [5] 
l5 = [2,3] 

#after adding all the lists above 
result = [2,2,3,5] 
+1

爲什麼合併後的有隻有兩個? –

+4

爲這兩個列表創建一個計數器,並將每個條目的max(counter1,counter2)項輸出到結果列表中。 – dornhege

+0

好吧,合併可能是錯誤的詞,但它是這樣的:如果我們「合併」l1和l2,我們得到[2,3]。如果我們然後將新列表與l3「合併」,我們得到[2,2,3](只有兩個2),等等...... – user966504

回答

9

當我明白你的問題,你要每個數字出現在它出現在任何輸入列表中的最高頻率的結果。您可以使用collections.Counter讓每一個人表中的頻率,並使用|運營商對他們的合併它們:

>>> c = collections.Counter([2, 2, 5]) 
>>> d = collections.Counter([2, 3, 7]) 
>>> list((c | d).elements()) 
[2, 2, 3, 5, 7] 

這裏是一個功能的加入任意數量的列表:

def merge_max_frequency(*iterables): 
    return reduce(operator.or_, map(collections.Counter, iterables)).elements() 

這函數返回一個可迭代項而不是一個列表 - 只需將list()應用於它即可獲得一個列表。

+0

非常感謝。這解決了我的問題完美 – user966504

0

感覺有點過於複雜,但這是我會怎麼解決這個問題:

>>> newlist = [] 
>>> for i,j in zip(list1, list2): 
>>> newlist.append(set([i,j])) 
>>> [x for sub in newlist for x in sub]  # flattening the list of sets 
[2, 2, 3, 5, 7] 
+0

感謝您添加括號。 – PascalVKooten