3

我正在尝试对以下详细信息列表进行分组:

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

我在某处做错了吗?

4

2 回答 2

7

您必须先对您的详细信息进行排序:

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

或者

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

 

Groupby 将连续匹配的记录组合在一起。

文档:

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

于 2013-03-26T11:33:56.363 回答
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')]}
于 2013-10-28T01:09:42.920 回答