2015-09-23 24 views
-1

有人可以幫我做功能第一列,第二列和總第三列。使用itertools.groupby總結報告

from itertools import groupby 
from operator import itemgetter 

things = [('2009-09-02','j', 12), 
      ('2009-09-02','j', 3), 
      ('2009-09-03','k',10), 
      ('2009-09-03','k',4), 
      ('2009-09-03','u', 22), 
      ('2009-09-06','m',33)] 

for k, items in groupby(things, itemgetter(1)):  
    for subitem in items: 
     print(subitem) 

得到了這樣的結果:

('2009-09-02', 'j', 12) ('2009-09-02', 'j', 3) ('2009-09-03', 'k', 10) ('2009-09-03', 'k', 4) ('2009-09-03', 'u', 22) ('2009-09-06', 'm', 33) 

期待這樣的結果:

('2009-09-02', 'j', 15) ('2009-09-03', 'k', 14) ('2009-09-03', 'u', 22) ('2009-09-06', 'm', 33) 

===================== ================================================== =

sales = [('Scotland', 'Edinburgh', 20000), 
     ('Scotland', 'Glasgow', 12500), 
     ('Wales', 'Cardiff', 29700), 
     ('Wales', 'Bangor', 12800), 
     ('England', 'London', 90000), 
     ('England', 'Manchester', 45600), 
     ('England', 'London', 29700)] 

回答

0

你不需要groupby,你可以使用字典,dict.setdefault方法更有效的方式:

>>> d={} 
>>> 
>>> for date,char,val, in things: 
...  d.setdefault((date,char),[]).append(val) 
... 
>>> [(i,j,sum(k)) for (i,j),k in d.items()] 
[('2009-09-02', 'j', 15), ('2009-09-03', 'u', 22), ('2009-09-06', 'm', 33), ('2009-09-03', 'k', 14)] 
>>> 

如果你想使用groupby作爲提示你可能會注意到,你需要給指數傳遞給itemgetter功能:

itemgetter(0, 1) 
2
>>> for a, b in groupby(things, itemgetter(0, 1)): 
...  print(a, sum(lst[2] for lst in b)) 

('2009-09-02', 'j') 15 
('2009-09-03', 'k') 14 
('2009-09-03', 'u') 22 
('2009-09-06', 'm') 33 
+0

真棒ozgur再次感謝 –

0

如果你想sum,你有總結,簡單的打印它不會奇蹟般地值相加爲您服務。

另外,根據你的例子,似乎你應該groupby基於第一和第二列。示例 -

for k,items in groupby(things, itemgetter(0, 1)):  
    print(k + (sum(x[2] for x in items),) 
+0

謝謝沙龍。上面還有一個銷售示例。然而,出於某種原因,它不會總結英格蘭和倫敦? –