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 に答える