2017-05-26 2 views

Antwort

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

Das liest sich mehr wie ein Standarddict-Ansatz. Mit einem Counter wäre es nicht typischer, 'c.update ({i: j})' 'zu verwenden? –

+0

@ChrisJohnson: Ich habe immer den 'defaultdict' Ansatz verwendet; Ich bin mir nicht sicher, was idiomatischer wäre. – GWW

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

Eine Möglichkeit, es zu tun, wie unten ist, von Zip-Funktion vermeidet,

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] 

Ausgabe

{'a': 400, 'b': 300} 
+0

'zip' ist viel besser für diesen Fall –

+0

@AzatIbrakov Ich denke, Zip-Funktion hat mehr Overhead als Bereich(). Zip erstellt eine temporäre Liste mit Composite-Containern von Tupeln, die von der Speichereffizienz und der Zeitkomplexität her nicht gut sind. – manu

+0

Wenn Sie 'Python 3' verwenden, wird' zip' iterierbar, also keine Speicherprobleme, auf 'Python2' sollten Sie [' itertools.izip'] (https://docs.python.org/2 /library/itertools.html#itertools.izip) –

0

sein wird, nehme ich einen klaren Weg (per Python's Zen), um Ihr Ziel zu erreichen, ist:

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) 

Welche Ihre erwartete Ausgabe gibt:

{ 'a': 500, 'b': 300}

0

Sie müssen nur zip iterieren für Schlüssel und Werte und setzen sie im Wörterbuch.

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} 
Verwandte Themen