このようなことを可能にする標準のpythonライブラリはありますか?
>>> [1,0,2,3,0,5,6].split([0])
>>> [[1],[2,3],[5,6]]
>>> [[1],[2,3],[5,6]].join([0])
>>> [1,0,2,3,0,5,6]
私にとって、それは非常に頻繁に必要とされるかなり基本的なもののように感じます. 文字列はデフォルトでこれらのメソッドをサポートしていることに注意してください。
これを簡単に行うための組み込み関数が存在するかどうかはわかりませんが、itertools を使用できます。
>>> from itertools import groupby, chain, islice, cycle
>>> lis = [1,0,2,3,0,5,6]
>>> [list(g) for k, g in groupby(lis, key =lambda x: x==0) if not k]
[[1], [2, 3], [5, 6]]
>>> lis1 = [[1],[2,3],[5,6]]
>>> c = [[0]]*(len(lis1) - 1)
>>> list(chain.from_iterable(roundrobin(lis1, c)))
[1, 0, 2, 3, 0, 5, 6]
Roundrobin
2番目に使用したレシピ:
def roundrobin(*iterables):
"roundrobin('ABC', 'D', 'EF') --> A D E B F C"
# Recipe credited to George Sakkis
pending = len(iterables)
nexts = cycle(iter(it).next for it in iterables)
while pending:
try:
for next in nexts:
yield next()
except StopIteration:
pending -= 1
nexts = cycle(islice(nexts, pending))
標準ライブラリについて知りません。これは少し不器用な解決策ですsplit
>>> a = [1, 0, 2, 3, 0, 5, 6]
>>> ind = [-1] + [i for i, x in enumerate(a) if x == 0] + [len(a)]
>>> [a[i + 1:j] for i, j in zip(ind, ind[1:])]
[[1], [2, 3], [5, 6]]
こちらですjoin
>>> l2 = [[1], [2, 3], [5, 6]]
>>> [i for x in l2 for i in x + [0]][:-1]
[1, 0, 2, 3, 0, 5, 6]