2017-05-26 78 views

回答

1
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) 
+0

这更像是一个defaultdict方法。使用计数器,使用'c.update({i:j})'是不是更典型? –

+0

@ChrisJohnson:我一直使用'defaultdict'方法;我不确定哪一个更习惯。 – GWW

3
result = {} 
for k,v in zip (['a','b','a'], [200,300,300]): 
    result[k] = result.get(k,0) + v 
print result 
-1

一种方式做到这一点是像下面,通过避免拉链功能

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} 
+0

对于这种情况''zip'好得多 –

+0

@AzatIbrakov我认为zip函数比range()有更多开销。 Zip会创建一个元组的临时复合容器列表,所以从内存效率和时间复杂度来看这并不好。 – manu

+0

如果您使用的是Python 3,那么'zip'会创建迭代,所以没有内存问题,在Python 2中您应该使用['itertools.izip'](https://docs.python.org/2 /library/itertools.html#itertools.izip) –

0

我假设一个清晰的方式(每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}

0

你只需要遍历的邮政编码为键和值,并把他们在字典中。

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}