2016-08-12 1 views
4

ive eine Liste in Python bekam die Python Duplikate in einer einzigen Liste zusammenführen und verbinden die Ergebnisse

['Nickey, 20', 'John, 50', 'Nickey, 30'] 

ich einfach wie

sieht es wollen jedoch die Duplikate zu entfernen, kombinieren die Zahlen so das Ergebnis

ist
['Nickey, 50', 'John, 50'] 

ich habe versucht, die folgende

A = {'a':1, 'b':2, 'c':3} 
B = {'b':3, 'c':4, 'd':5} 
c = {x: A.get(x, 0) + B.get(x, 0) for x in set(A).union(B)} 
print c 

aber wie Sie die Liste sehen kann, ist anders forma tted, zog ich mich aus einer txt-Datei ...

Gibt es eine Möglichkeit bekommen zu verwenden, Set, Union aber mit meiner Formatierung einer Liste - und kann ich es mit einer Liste zu tun, anstatt der Verschmelzung von 2

Antwort

1

ein Ansatz ist es, ein Wörterbuch zu erstellen, die Gesamtzahl pro Namen zu speichern:

from collections import defaultdict 

people = ['Nickey, 20', 'John, 50', 'Nickey, 30'] 
people_map = defaultdict(int) 
for person in people: 
    name, number_str = person.split(', ') 
    people_map[name] += int(number_str) 

print ['{}, {}'.format(person, total) for person, total in people_map.iteritems()] 
0
a = [ 'Nickey, 20', 'John, 50', 'Nickey, 30' ] 
d = dict() 
t = list() 

for i in a: 
    t = i.split(", ") 
    d[t[0]] = d.get(t[0], 0) + int(t[1]) 

print([ ", ".join([k,str(v)]) for k,v in d.items() ]) 

Dieses

['Nickey, 50', 'John, 50']

folgendes Ergebnis geben
1

Wir sollten reduce hier verwenden.

from collections import defaultdict 
# below required for Python 3 
# from functools import reduce 

data = ['Nickey, 20', 'John, 50', 'Nickey, 30'] 

def accum(sums, p): 
    sums[p[0]] += int(p[1]) 
    return sums 

cum = reduce(accum, [s.split(', ') for s in data], defaultdict(int)) 
print(cum) 

Alternativ können wir collections.Counter verwenden:

from collections import Counter 
import operator 

cum = reduce(operator.iadd, 
      (Counter({k: int(v)}) for k, v in (s.split(', ') for s in data)), Counter()) 
print(cum) 
0

Diese sehr einfach ein getan werden kann, mit dict und get():

data = ['Nickey, 20', 'John, 50', 'Nickey, 30'] 
names = {} 
for value in data: 
    k, v = value.split(', ') 
    names[k] = names.get(k, 0) + int(v) 

result = ['{}, {}'.format(k, v) for k, v in names.items()] 
+0

Whoops, @stuartnox veröffentlicht bereits eine sehr ähnliche Lösung. – jbhak4

Verwandte Themen