组合两个python列表并按键聚合值

组合两个python列表并按键聚合值,python,list,function,dictionary,aggregate,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}?一种方法如下,通过避免使用zip函数 from collections import Counter a = ['a','b','a'] b = [200,300,300] c = Counter() for i, j in

我在这里看到了两个列表

a = ['a','b','a']
b = [200,300,300]
当我这样打印时:

print dict(zip(a,b))
我得到:

{'A': 300, 'B': 300}
如何根据键聚合值,以便


{'A':500,'B':300}

一种方法如下,通过避免使用zip函数

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)
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}
我认为实现目标的一个明确方法是:

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}

这更像是一种默认的dict方法。使用计数器,使用
c.update({i:j})
不是更为典型吗?@ChrisJohnson:我一直使用
defaultdict
方法;我不确定哪一个更地道。
zip
更适合这个case@AzatIbrakov我认为zip函数的开销比range()大。Zip将创建一个临时的元组复合容器列表,从内存效率和时间复杂度的角度来看,它不是很好。如果您使用
Python3
,那么
Zip
将创建一个iterable,因此没有内存问题,在
Python2
上,您应该使用从列表中获取元素(并且您将获得
a[i]
两次)显然比使用
zip
/
izip
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}