2017-04-02 69 views
2

我的元組下面的列表:[('a', 1), ('a', 1), ('b', 1), ('c',1), ('a', 1), ('c', 1)]如何使用reduce函數在python中創建字數輸出?

我想知道我是否可以使用Python的reduce功能聚集並出示以下的輸出:[('a', 3), ('b', 1), ('c', 2)]

或者有其他的方式,我會喜歡知道(循環很好)

+0

除非你同時做,否則最好的方法是使用HashMap和

+2

[如何總結Python中具有相同名稱的元組的值]的重複(http://stackoverflow.com/questions/31430384/how-to-sum-values-of-tuples-that-have-same-name -in的Python) – manvi77

回答

3

使用reduce似乎很難實現,因爲如果兩個「減少」的元組都不具有相同的字母,則無法計算結果。如何減少('a',1)('b',1)以獲得一些可行的結果?

盡我所能做的就是l = functools.reduce(lambda x,y : (x[0],x[1]+y[1]) if x[0]==y[0] else x+y,sorted(l))

它讓我('a', 3, 'b', 1, 'c', 1, 'c', 1)。所以它適用於第一個元素,但是需要一個以上的通過才能完成其他元素(重新創建元組並且創建另一個類似的reduce,好吧,至少說起來效率不高!)。

無論如何,這裏是做

第一的2種工作方式,使用同一種collections.Counter計數元素:我們不能用listcomp因爲每個元素的重量(即使這裏

l = [('a', 1), ('a', 1), ('b', 1), ('c',1), ('a', 1), ('c', 1)] 

import collections 

c = collections.Counter() 
for a,i in l: 
    c[a] += i 

這是1)

結果:一本字典:Counter({'a': 3, 'c': 2, 'b': 1})

第二個選項:使用itertools.groupby排序列表上,按名稱/信分組,並且對所述整數軸承相同字母的總和:

print ([(k,sum(e for _,e in v)) for k,v in itertools.groupby(sorted(l),key=lambda x : x[0])]) 

結果:

[('a', 3), ('b', 1), ('c', 2)] 
1

使用defaultdict子類和sum功能的另一種方法:

import collections 

l = [('a', 1), ('a', 1), ('b', 1), ('c',1), ('a', 1), ('c', 1)] 
d = collections.defaultdict(list) 
for t in l: 
    d[t[0]].append(t[1]) 

result = [(k,sum(v)) for k,v in d.items()] 
print(result) 

輸出:

[('b', 1), ('a', 3), ('c', 2)] 
相關問題