注意:根据某些人的建议,我将此问题重新发布到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']]
如您所见,如果长度列表未涵盖所有列表,我会将其余元素附加为附加子列表。另外,如果长度列表产生更多要拆分的列表中的元素,我想避免最后出现空列表。
我已经有一个可以按我想要的方式工作的功能:
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
但我想知道是否有一种更 Pythonic 的方式来编写这样的函数。
注意:我take(n, iterable)
从Itertools Recipes中获取: