私は、Pythonに新たなんだと私はグループがそのようなNone
シグナル継続アイテムとアイテムを一覧表示機能の書き込みをしようとしている:私の実際のデータは、はるかに複雑な項目がありますが、私はしましたリスト内の「継続」アイテムをグループ化します。 itertoolsのgroupbyキーの機能が悪いのですか?
>>> g([1, None, 1, 1, None, None, 1])
[[1, None], [1], [1, None, None], [1]]
をこの質問のためにコアに単純化された事柄。
これは、これまでのところ私のソリューションです:
import itertools
# input
x = [1, None, 1, 1, None, None, 1]
# desired output from g(x)
y = [[1, None], [1], [1, None, None], [1]]
def f(x):
if x is None:
f.lastx = x
else:
if x != f.lastx:
f.counter += 1
return f.counter
def g(x):
f.lastx = None
f.counter = 0
z = [list(g) for _, g in itertools.groupby(x, f)]
return z
assert y == g(x)
は、これは動作しますが、私はそれが非常に醜いと知っています。
これを行うにはより良い(そしてもっとPythonの)方法がありますか?例えば。ステートフルなキー機能はありません。
うわー、それは密なコードです。 :)私はそれがどのように動作するのか理解するのは少しはかりましたが、私はそれが好きで、このアプローチがどのようにかなりフレキシブルであるかを見ることができます。 –
実際、私はちょうど何かに気付いた...このアプローチは、入力データに対して2回のパスが必要です。データがストリーミングされている場合(大きな問題であるため)、この方法は機能しません。 :( –
@BrianG:あなたは* list *アイテムをグループ化していると言ってはいけないでしょう。;-)しかしストリームを扱うのも簡単です。 – DSM