2013-08-12 2 views

Antwort

14

Wie wäre es damit? Sie können über collections.defaultdict lesen.

>>> from collections import defaultdict 
>>> testDict = defaultdict(int) 
>>> p = [('AAPL', 50), ('AAPL', -50), ('RY', 100), ('RY', -43)] 
>>> for key, val in p: 
     testDict[key] += val 


>>> testDict.items() 
[('AAPL', 0), ('RY', 57)] 
+3

+1 nur Ging vorschlagen 'defaultdict' mich. – cdhowie

+0

Wie wäre es damit? Vielen Dank, hat perfekt funktioniert und jetzt habe ich auch etwas zu lesen. – pedram

+1

'Sammlungen' Bibliothek ist voller Edelsteine. ;) –

0

ohne explizite Schleifen:

>>> from itertools import groupby 
>>> from operator import itemgetter 
>>> p = [('AAPL', 50), ('AAPL', -50), ('RY', 100), ('RY', -43)] 
>>> map(lambda g: (g[0], sum(map(itemgetter(1), g[1]))), 
...  groupby(sorted(p), itemgetter(0))) 
[('AAPL', 0), ('RY', 57)] 
+0

Beachten Sie, dass dies nur funktioniert, wenn die Bestände zusammenhängend sind; Sie müssten sonst nach der Keyfunc sortieren. Eigentlich, um darüber nachzudenken, ich denke, es liest sich ein wenig besser ohne zwei Karten: '[(k, sum (map (itemgetter (1), g))) für k, g in groupby (p, itemgetter (0))] ''. – DSM

1

Hier ist eine Lösung, die nicht den Import mit sich bringt:

>>> p = [('AAPL', 50), ('AAPL', -50), ('RY', 100), ('RY', -43)] 
>>> d = {x:0 for x,_ in p} 
>>> for name,num in p: d[name] += num 
... 
>>> Result = map(tuple, d.items()) 
>>> Result 
[('AAPL', 0), ('RY', 57)] 
>>> 

Hinweis: Dies ist für Python 2.x. In 3.x müssen Sie Folgendes tun: Result = list(map(tuple, d.items())).

0

Ich würde dies collections.Counter mit tun:

In [2]: from collections import Counter 

In [3]: c = Counter() 

In [4]: for k, v in p: 
    ...:  c[k] += v 
    ...:  
In [5]: c 
Out[5]: Counter({'AAPL': 0, 'RY': 57}) 

Dann können Sie die most_common Methode von Counter Objekte aufrufen, eine Liste von Tupeln durch die Werte in absteigender Reihenfolge sortiert zu bekommen.

In [5]: c.most_common() 
Out[5]: [('RY', 57), ('AAPL', 0)] 

Falls Sie brauchen, sorted(c.items()) Tupeln durch ihre ersten Elemente sortieren verwenden:

In [6]: sorted(c.items()) 
Out[6]: [('AAPL', 0), ('RY', 57)] 
Verwandte Themen