【发布时间】:2017-10-26 20:53:52
【问题描述】:
我在这里看到了两个列表。
a = ['a','b','a']
b = [200,300,300]
当我这样打印时:
print dict(zip(a,b))
我明白了:
{'A': 300, 'B': 300}
如何根据键聚合值以便得到
{'A': 500, 'B': 300}?
【问题讨论】:
标签: python list function dictionary aggregate
我在这里看到了两个列表。
a = ['a','b','a']
b = [200,300,300]
当我这样打印时:
print dict(zip(a,b))
我明白了:
{'A': 300, 'B': 300}
如何根据键聚合值以便得到
{'A': 500, 'B': 300}?
【问题讨论】:
标签: python list function dictionary aggregate
result = {}
for k,v in zip (['a','b','a'], [200,300,300]):
result[k] = result.get(k,0) + v
print result
【讨论】:
from collections import Counter
a = ['a','b','a']
b = [200,300,300]
c = Counter()
for i, j in zip(a, b):
c[i] += j
print(c)
【讨论】:
c.update({i:j})不是更典型吗?
defaultdict 方法;我不确定哪个会更惯用。
我认为实现目标的明确方法(根据Python's Zen)是:
from __future__ import print_function
a = ['a','b','a']
b = [200,300,300]
d = dict()
for place, key in enumerate(a):
try:
d[key] += b[place]
except KeyError:
d[key] = b[place]
print(d)
这给出了您预期的输出:
{'a': 500, 'b': 300}
【讨论】:
您只需要遍历 zip 以获取键和值并将它们放入字典中。
a = ['a','b','a']
b = [200,300,300]
for key, val in zip(a,b):
if key in combined_dict:
combined_dict[key] += val
else:
combined_dict[key] = val
print(combined_dict)
=> {'a': 500, 'b': 300}
【讨论】:
一种方法如下所示,避免使用 zip 功能,
aggregateDict = {}
a= ['a', 'b', 'a']
b=[200, 300, 200]
for i in range(len(a)):
aggregateDict[a[i]] = aggregateDict.get(a[i], 0) + b[i]
输出将是
{'a': 400, 'b': 300}
【讨论】:
zip 更适合这种情况
Python 3,则zip 将创建可迭代,因此没有内存问题,在Python 2 上您应该使用itertools.izip
a[i])显然比使用zip/izip有更多的开销