VGo*_*nPa 1 python split list partition
注意:根据某些人的建议,我将此问题转发给codereview网站
我想使用包含每个拆分长度的另一个列表拆分列表.
例如.
>>> print list(split_by_lengths(list('abcdefg'), [2,1]))
... [['a', 'b'], ['c'], ['d', 'e', 'f', 'g']]
>>> print list(split_by_lengths(list('abcdefg'), [2,2]))
... [['a', 'b'], ['c', 'd'], ['e', 'f', 'g']]
>>> print list(split_by_lengths(list('abcdefg'), [2,2,6]))
... [['a', 'b'], ['c', 'd'], ['e', 'f', 'g']]
>>> print list(split_by_lengths(list('abcdefg'), [1,10]))
... [['a'], ['b', 'c', 'd', 'e', 'f', 'g']]
>>> print list(split_by_lengths(list('abcdefg'), [2,2,6,5]))
... [['a', 'b'], ['c', 'd'], ['e', 'f', 'g']]
Run Code Online (Sandbox Code Playgroud)
您可以注意到,如果长度列表未涵盖所有列表,则我将其余元素作为附加子列表附加.此外,我希望在长度列表产生更多要分割的列表中的元素的情况下,最后避免空列表.
我已经有一个按我想要的功能:
def take(n, iterable):
"Return first n items of the iterable as a list"
return list(islice(iterable, n))
def split_by_lengths(list_, lens):
li = iter(list_)
for l in lens:
elems = take(l,li)
if not elems:
break
yield elems
else:
remaining = list(li)
if remaining:
yield remaining
Run Code Online (Sandbox Code Playgroud)
但是我想知道是否有更多的pythonic方法来编写一个函数.
注意:我take(n, iterable)从Itertools食谱中抓取:
你可以这样做itertools.islice:
from itertools import islice
def split_by_lengths(seq, num):
it = iter(seq)
for x in num:
out = list(islice(it, x))
if out:
yield out
else:
return #StopIteration
remain = list(it)
if remain:
yield remain
Run Code Online (Sandbox Code Playgroud)
演示:
>>> list(split_by_lengths(list('abcdefg'), [2,1]))
[['a', 'b'], ['c'], ['d', 'e', 'f', 'g']]
>>> list(split_by_lengths(list('abcdefg'), [2,2]))
[['a', 'b'], ['c', 'd'], ['e', 'f', 'g']]
>>> list(split_by_lengths(list('abcdefg'), [2,2,6]))
[['a', 'b'], ['c', 'd'], ['e', 'f', 'g']]
>>> print list(split_by_lengths(list('abcdefg'), [1,10]))
[['a'], ['b', 'c', 'd', 'e', 'f', 'g']]
Run Code Online (Sandbox Code Playgroud)
上述版本的较短版本,但请注意,与第一个答案不同,一旦迭代器耗尽,这将不会短路.
def split_by_lengths(seq, num):
it = iter(seq)
out = [x for x in (list(islice(it, n)) for n in num) if x]
remain = list(it)
return out if not remain else out + [remain]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
175 次 |
| 最近记录: |