How to ragged partition a list in Python?

*爱你&永不变心* 提交于 2020-01-03 05:39:30

问题


Is there a built-in Python function such that with

vals=[1,2,3,4,5]

then foo(vals,2) gives

[[1,2],[3,4],[5]]

I am looking for the behaviour that Wolfram Language gives with

Partition[Range@5, UpTo@2]
{{1, 2}, {3, 4}, {5}}

回答1:


This is built into neither the Python language itself nor its standard library, but might be what you are looking for functionality-wise:

Install the third-party-library more-itertools (not to be confused with the itertools module, which is part of the Python standard library), e.g. with

pipenv install 'more-itertools >= 2.4'

Then you can use the function sliced() it provides:

from more_itertools import sliced

vals = [1,2,3,4,5]
slices = list(sliced(vals, 2))

print(slices)

Result:

[[1, 2], [3, 4], [5]]

If the iterable isn't sliceable, you can use chunked() from the same library instead of sliced.




回答2:


You can use a list comprehension with list indexing / slicing:

vals = [1,2,3,4,5]

def foo(v, j=2):
    return [v[i:i+j] for i in range(0, len(v), j)]

print(foo(vals, 2))

[[1, 2], [3, 4], [5]]

print(foo(vals, 3))

[[1, 2, 3], [4, 5]]



回答3:


Try this: 'n' is the subgroup size. 'l' is the list

def groups(l, n):
    for i in range(0, len(l), n):
        yield l[i:i + n]


来源:https://stackoverflow.com/questions/50086583/how-to-ragged-partition-a-list-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!