2013-03-26 49 views
3

我妈妈试图组以下详细信息列表:Python的GROUPBY声明

details = [('20130325','B'), ('20130320','A'), ('20130325','B'), ('20130320','A')] 

>>for k,v in itertools.groupby(details,key=operator.itemgetter(0)): 
>> print k,list(v) 

而这与上述GROUPBY语句的输出:

20130325 [('20130325', 'B')] 

20130320 [('20130320', 'A')] 

20130325 [('20130325', 'B')] 

20130320 [('20130320', 'A')] 

但我预计产量为:

20130325 [('20130325', 'B'),('20130325', 'B')] 

20130320 [('20130320', 'A'),('20130320', 'A')] 

我做错了什么地方?

回答

7

你有你的详细信息进行排序:

details.sort(key=operator.itemgetter(0)) 

fst = operator.itemgetter(0) 
itertools.groupby(sorted(details, key=fst), key=fst) 

 

GROUPBY组连续的匹配记录在一起。

Documentation:

GROUPBY的操作()是类似于Unix上uniq的过滤器。每当关键函数的值发生变化时它就会生成一个中断或新的组(这就是为什么通常需要使用相同的关键函数对数据进行排序的原因)。该行为与SQL的GROUP BY不同,后者聚合公共元素而不管其输入顺序如何。

1

toolz项目提供了非流GROUPBY

$ pip install toolz 
$ ipython 

In [1]: from toolz import groupby, first 

In [2]: details = [('20130325','B'), ('20130320','A'), ('20130325','B'), ('20130320','A')] 

In [3]: groupby(first, details) 
Out[3]: 
{'20130320': [('20130320', 'A'), ('20130320', 'A')], 
'20130325': [('20130325', 'B'), ('20130325', 'B')]}