2011-09-15 64 views
6

我需要團結在Python3,其中重複可以存在兩個列表,併爲一組,這些結果列表將包含多達最大兩個lists.An例子可能澄清清單聯合:與重複

[1,2,2,5](some operator)[2,5,5,5,9]=[1,2,2,5,5,5,9] 

想法?

回答

12

可以使用collections.Counter類:

>>> from collections import Counter 
>>> combined = Counter([1,2,2,5]) | Counter([2,5,5,5,9]) 
>>> list(combined.elements()) 
[1, 2, 2, 5, 5, 5, 9] 

它可以用作多集(無序集合,其中每個元素可以出現多次)。 |運算符爲您提供多重集合,其中每個元素出現最大(apperances_in_counter1,appearances_in_counter2)次。

這個類是在Python 2.7和3.1中添加的。

+0

不錯......我不知道那個模塊。 – kaiseroskilo

+0

作品來自python 2.7 – varela

+1

酷,我不知道那一個。由於術語「multiset」對我來說聽起來像是一個流行語,所以讓我引用Python文檔中的描述:**「計數器是用於計算可哈希對象的字典子類」**我發現這個描述更直觀,我希望你也會。 – Kos

1
  1. 轉換陣列字典與a[key] = count

  2. 創建規則c[key] = a.get(key, 0) > b.get(key, 0) and a[key] or b[key]新字典。你需要在a和b字典中遍歷兩個鍵。

  3. 展開詞典,result += [value] * key

2

爲什麼首先使用列表?這些數據看起來像一個字典對我說:

[1,2,2,5] -> {1: 1, 2: 2, 5: 1} 
[2,5,5,5,9] -> {2: 1, 5: 3, 9: 1} 

然後很簡單:

keys = set(a.keys()+b.keys()) 
vals = [max(a.get(n, 0), b.get(n, 0)) for n in keys] 
d = dict(zip(keys, vals)) 
print d 

結果:

{1:1,2:2,5:3,9: 1}

+1

更新:在@interjay的答案之後,你會得到基本相同的數據模型,但已經實現了使用它的方法。去解決這個問題! – Kos