我有两个列表在这里看到。结合两个python列表,并通过密钥汇总值
a = ['a','b','a']
b = [200,300,300]
当我打印像这样:
print dict(zip(a,b))
我得到:
{'A': 300, 'B': 300}
我怎么会集结基于关键的值,使我得到
{'A': 500, 'B': 300}
?
我有两个列表在这里看到。结合两个python列表,并通过密钥汇总值
a = ['a','b','a']
b = [200,300,300]
当我打印像这样:
print dict(zip(a,b))
我得到:
{'A': 300, 'B': 300}
我怎么会集结基于关键的值,使我得到
{'A': 500, 'B': 300}
?
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)
result = {}
for k,v in zip (['a','b','a'], [200,300,300]):
result[k] = result.get(k,0) + v
print result
一种方式做到这一点是像下面,通过避免拉链功能,
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'好得多 –
@AzatIbrakov我认为zip函数比range()有更多开销。 Zip会创建一个元组的临时复合容器列表,所以从内存效率和时间复杂度来看这并不好。 – manu
如果您使用的是Python 3,那么'zip'会创建迭代,所以没有内存问题,在Python 2中您应该使用['itertools.izip'](https://docs.python.org/2 /library/itertools.html#itertools.izip) –
我假设一个清晰的方式(每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}
你只需要遍历的邮政编码为键和值,并把他们在字典中。
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}
这更像是一个defaultdict方法。使用计数器,使用'c.update({i:j})'是不是更典型? –
@ChrisJohnson:我一直使用'defaultdict'方法;我不确定哪一个更习惯。 – GWW