2016-12-04 3 views
2

Ich habe eine Liste von Tupeln wie im folgenden Beispiel. Wie kann ich eine Liste durchgehen und alle Abkürzungen finden, die gleich sind und dann Punkte hinzufügen. Möchten Sie dies für alle Abkürzungen tun können.Vergleichen von Werten in einer Liste von Tupeln

loop = [('MD', 0.0), ('MD', 0.0), ('MD', 0.0), ('LA', 0.0625), ('LA', 0.0625), ('CA', -0.5), ('CA', -0.5), ('CA', -0.5))] 

Antwort

5

Sie können es mit itertools.groupby()

>>> from itertools import groupby 
>>> loop = sorted(loop, key = lambda x:x[0]) 
>>> {k:sum(list(e[1] for e in v)) for k, v in groupby(loop, lambda x:x[0])} 
{'MD': 0.0, 'CA': -1.5, 'LA': 0.125} 
>>> 

Durchschnitt zu erhalten, ersetzen Sie den obigen Code mit unter:

>>> result = dict() 
>>> for k, v in groupby(loop, lambda x:x[0]): 
...  temp = list(v) 
...  result[k] = sum(i[1] for i in temp)/len(temp) 
... 
>>> result 
{'MD': 0.0, 'LA': 0.0625, 'CA': -0.5} 
>>> 
+0

Genie, danke !! –

+1

Ich nehme an, Geschwindigkeit ist kein Problem, obwohl der Log (n) Overhead hier ein wenig unnötig scheint. –

3

Sie Counter als eine andere Lösung verwenden können. Dieser Ansatz löst das Problem mit der O (n) -Zeitkomplexität.

from collections import Counter 

loop = [('MD', 0.0), ('MD', 0.0), ('MD', 0.0), ('LA', 0.0625), ('LA', 0.0625), ('CA', -0.5), ('CA', -0.5), ('CA', -0.5)] 
c = Counter() 
for k, v in loop: 
    c[k] += v 

print(c) 
# Counter({'LA': 0.125, 'MD': 0.0, 'CA': -1.5}) 
print(dict(c)) 
# {'LA': 0.125, 'CA': -1.5, 'MD': 0.0} 
+0

Gibt es eine Möglichkeit, die Summe, die Sie erstellt haben, durch die Anzahl der Einträge zu teilen. Versuchen, den Durchschnitt zu bekommen. –

+0

Sie können einen anderen Zähler verwenden, um die Anzahl der Vorkommen für jedes Element zu erfassen. wie einfach 'c2 [k] + = 1'. – amin

+0

Vielen Dank! –

Verwandte Themen