3

操作しなければならないリストは長くなりますが、例えば [3,5,0,6,8,9,7,0,1,0]. ゼロの間の要素の量は一定ではありません。ゼロの前にある用語をサブリストにグループ化したいと考えています。私が探しているのは[[3,5],[6,8,9,7],[1]]; ゼロは用語を分割しますが、サブリストには含まれません。

要素をグループ化しているので関数を使用できるとは思わないsplitので、この方法でグループ化する方法を見つけようとして立ち往生しています。

4

2 に答える 2

6
>>> from itertools import groupby
>>> L = [3,5,0,6,8,9,7,0,1,0]
>>> [list(g) for k, g in groupby(L, key=bool) if k]
[[3, 5], [6, 8, 9, 7], [1]]

key=boolは空0と見なされるため、この場合は機能しますが、@ AshwiniChaudhary が指摘したように、たとえばによって分割しない場合は、カスタム関数を使用する必要があります。で割るkey02

key=lambda x: x != 2

説明:

最初に、どのように機能するかを説明しますkey

>>> bool(3), bool(5)
(True, True)
>>> bool(0)
False

ご覧のとおり、それ以外の場合は、またはがTrue返されます。(実際には、他の空の組み込みオブジェクトと同様にreturn も返しますが、ここでは数値のみを考慮しています)FalseFalse0Truebool('')bool([])False

関数groupbyの結果をグループ化するだけなので、 s とs のグループになります。key01

>>> [(key, group) for key, group in groupby(L, key=bool)]
[(True, <itertools._grouper object at 0xb6fc1dac>), (False, <itertools._grouper object at 0xb6fc432c>), (True, <itertools._grouper object at 0xb6fc422c>), (False, <itertools._grouper object at 0xb6fc4c2c>), (True, <itertools._grouper object at 0xb6fc428c>), (False, <itertools._grouper object at 0xb6fc476c>)]

しかし、ご覧のとおり、グループは奇妙なオブジェクト、itertools._grouperオブジェクトです。リストを返さないのはなぜですか?itertoolsアイテムを遅延してグループ化する方がはるかに効率的ですが、グループ内のすべてのアイテムをlist.

>>> [(key, list(group)) for key, group in groupby(L, key=bool)]
[(True, [3, 5]), (False, [0]), (True, [6, 8, 9, 7]), (False, [0]), (True, [1]), (False, [0])]

ただし、 は必要ありません。そうであるkeyかどうかを確認し、Trueこの述語を満たすアイテムのみを返す必要があるだけです。これが最初の私の答えにつながります。

>>> [list(group) for key, group in groupby(L, key=bool) if key]
[[3, 5], [6, 8, 9, 7], [1]]
于 2013-06-02T01:24:14.017 に答える
1

比較的ばかげた 1 行のバージョン:

>>> L = [3,5,0,6,8,9,7,0,1,0]
>>> [ map(int, str(r)) for r in "".join([str(r) for r in L]).rstrip("0").split("0") ]
[[3, 5], [6, 8, 9, 7], [1]]

ただし、新しいモジュールのインポートはありません。

于 2013-06-02T01:50:58.540 に答える