2015-09-23 63 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

谢谢沙龙。上面还有一个销售示例。然而,出于某种原因,它不会总结英格兰和伦敦? –