我的元組下面的列表:[('a', 1), ('a', 1), ('b', 1), ('c',1), ('a', 1), ('c', 1)]
如何使用reduce函數在python中創建字數輸出?
我想知道我是否可以使用Python的reduce
功能聚集並出示以下的輸出:[('a', 3), ('b', 1), ('c', 2)]
或者有其他的方式,我會喜歡知道(循環很好)
我的元組下面的列表:[('a', 1), ('a', 1), ('b', 1), ('c',1), ('a', 1), ('c', 1)]
如何使用reduce函數在python中創建字數輸出?
我想知道我是否可以使用Python的reduce
功能聚集並出示以下的輸出:[('a', 3), ('b', 1), ('c', 2)]
或者有其他的方式,我會喜歡知道(循環很好)
使用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)]
使用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)]
除非你同時做,否則最好的方法是使用HashMap和
[如何總結Python中具有相同名稱的元組的值]的重複(http://stackoverflow.com/questions/31430384/how-to-sum-values-of-tuples-that-have-same-name -in的Python) – manvi77