2013-08-12 36 views

Trả lời

14

Làm thế nào về điều này? Bạn có thể đọc khoảng collections.defaultdict.

>>> 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 Được chỉ đi để đề nghị 'defaultdict' bản thân mình. – cdhowie

+0

Làm thế nào về điều đó thực sự! Cảm ơn rất nhiều, làm việc một cách hoàn hảo và bây giờ tôi có một số đọc để làm là tốt. – pedram

+1

Thư viện 'bộ sưu tập 'đầy đá quý. ;) –

0

mà không cần bất kỳ vòng lặp rõ ràng:

>>> 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

Lưu ý rằng điều này sẽ chỉ hoạt động nếu các cổ phiếu tiếp giáp; bạn cần phải sắp xếp theo keyfunc nếu không. Trên thực tế, hãy nghĩ về nó, tôi nghĩ nó tốt hơn một chút nếu không có hai bản đồ: '[(k, sum (map (itemgetter (1), g))) cho k, g trong groupby (p, itemgetter (0))] '. – DSM

1

Đây là một giải pháp mà không liên quan đến nhập khẩu:

>>> 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)] 
>>> 

Note này là dành cho Python 2.x. Trong 3.x, bạn sẽ cần phải làm: Result = list(map(tuple, d.items())).

0

tôi sẽ làm điều này bằng collections.Counter:

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}) 

Sau đó, bạn có thể gọi phương thức most_common của Counter đối tượng để có được một danh sách các hàng được sắp xếp theo các giá trị theo thứ tự giảm dần.

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

Trong trường hợp bạn cần phải sắp xếp các bộ bởi các yếu tố đầu tiên của họ, sử dụng sorted(c.items()):

In [6]: sorted(c.items()) 
Out[6]: [('AAPL', 0), ('RY', 57)] 
Các vấn đề liên quan