我是新來的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)
這工作,但我知道這是非常難看。
有沒有更好的(更Pythonic)方法來做到這一點?例如。沒有狀態鍵功能。
哇,這是一些密集的代碼。 :)我花了一些時間來了解它的工作原理,但我喜歡它,並且可以看到這種方法相當靈活。 –
實際上,我只是注意到了一些......這種方法需要2遍以上的輸入數據。如果數據流式傳輸(因爲它是我的更大的問題),那麼這種方法是行不通的。 :( –
@BrianG:那麼你不應該說你是分組*列表*項目。;-)但是處理一個流也很容易。 – DSM