6

このようなリストがあります

[u'201003', u'200403', u'200803', u'200503', u'201303',
 u'200903', u'200603', u'201203', u'200303', u'200703', u'201103']

このリストを「years_list」と呼びましょう

groupby year を行ったとき、

group_by_yrs_list = groupby(years_list, key = lambda year_month: year_month[:-2]) 
for k,v in group_by_yrs_list:
  print k, list(v)

目的の出力が得られました:

2010 [u'201003']
2004 [u'200403']
2008 [u'200803']
2005 [u'200503']
2013 [u'201303']
2009 [u'200903']
2006 [u'200603']
2012 [u'201203']
2003 [u'200303']
2007 [u'200703']
2011 [u'201103']

次に、このように実装を少し変更しました。

  group_by_yrs_list = dict(groupby(years_list, key = lambda year_month: year_month[:-2]))
  for k,v in group_by_yrs_list.items():
    print k, list(v)

辞書を追加したばかりですが、出力が異なります。

2003 []
2006 []
2007 []
2004 []
2005 []
2008 []
2009 []
2011 [u'201103']
2010 []
2013 []
2012 []

理由がわかりませんでした。dictが実際に何をしているのかを見つけるのを手伝ってください。

(パイソン2.7)

4

4 に答える 4

9

groupby(key, iterator -of-group) のペアを生成します。2 番目のペアを反復している場合、最初のペアのグループの反復子は既に消費されているため、空のリストが得られます。

次のコードを試してください:

group_by_yrs_list = {year:list(grp) for year, grp in groupby(years_list, key=lambda year_month: year_month[:-2])}
for k, v in group_by_yrs_list.items():
    print k, v
于 2013-10-01T06:19:38.877 に答える
6

ここでの問題はgroupby、各キーとサブイテレータが順番に生成されることです。

>>> for k, v in groupby(years_list, key = lambda year_month: year_month[:-2]):
...    print k, v
2010 <itertools._grouper object at 0x801c68950>
2004 <itertools._grouper object at 0x801bb3a90>
2008 <itertools._grouper object at 0x801c68950>
2005 <itertools._grouper object at 0x801bb3a90>
2013 <itertools._grouper object at 0x801c68950>
2009 <itertools._grouper object at 0x801bb3a90>
2006 <itertools._grouper object at 0x801c68950>
2012 <itertools._grouper object at 0x801bb3a90>
2003 <itertools._grouper object at 0x801c68950>
2007 <itertools._grouper object at 0x801bb3a90>
2011 <itertools._grouper object at 0x801c68950>

の次の繰り返しでイテレータがリセットされる<itertools._grouper object ...>ため、保存する前にそれぞれを実際のリストに変換する必要があります。そうしないと、有用な反復子が 1 つだけ残るため、辞書の内容を出力すると、空でないリストが 1 つ得られます (反復子を使い果たします)。もう一度印刷すると、すべて空のリストが得られます。groupby

重要なのは、イテレータがまだ適切なうちにリスト化することです (他のいくつかがコード例に勝っているように見えますが、私はfalsetru のバリアントを好みます)。

于 2013-10-01T06:21:40.887 に答える
2

からの非ストリーミングgroupby操作を試してくださいtoolz

$ pip install toolz
$ ipython

In [1]: from toolz import groupby

In [2]: years_list = [u'201003', u'200403', u'200803', u'200503', u'201303',
   ...:  u'200903', u'200603', u'201203', u'200303', u'200703', u'201103']

In [3]: get_year = lambda year_month: year_month[:-2]

In [4]: groupby(get_year, years_list)
Out[4]: 
{u'2003': [u'200303'],
 u'2004': [u'200403'],
 u'2005': [u'200503'],
 u'2006': [u'200603'],
 u'2007': [u'200703'],
 u'2008': [u'200803'],
 u'2009': [u'200903'],
 u'2010': [u'201003'],
 u'2011': [u'201103'],
 u'2012': [u'201203'],
 u'2013': [u'201303']}
于 2013-10-28T01:06:58.437 に答える
1

この答えによると、これを実行して次のように変換できますdict

group_by_yrs_list = dict((k,list(v)) for k,v in groupby(years_list, key=lambda x: x[:4]))

の出力は一種のジェネレーターでgroupbyあるitertools.groupbyオブジェクトであり、明らかにコンストラクターの引数として直接使用できないためdictです。

于 2013-10-01T06:20:07.483 に答える