Как рваный раздел списка в Python? - PullRequest
0 голосов
/ 29 апреля 2018

Есть ли встроенная функция Python такая, что с

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

тогда foo(vals,2) дает

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

Я ищу поведение, которое дает Wolfram Language с

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

Ответы [ 3 ]

0 голосов
/ 29 апреля 2018

Попробуйте: n - размер подгруппы. 'l' - список

def groups(l, n):
    for i in range(0, len(l), n):
        yield l[i:i + n]
0 голосов
/ 09 мая 2018

Он не встроен ни в сам язык Python, ни в его стандартную библиотеку, но может быть тем, что вам нужно для функциональности:

Установите стороннюю библиотеку more-itertools (не путать с модулем itertools, который является частью стандартной библиотеки Python), например, с

pipenv install 'more-itertools >= 2.4'

Тогда вы можете использовать функцию sliced(), которую она обеспечивает:

from more_itertools import sliced

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

print(slices)

Результат:

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

Если итерация не может быть срезана, вы можете использовать chunked() из той же библиотеки вместо нарезки.

0 голосов
/ 29 апреля 2018

Вы можете использовать понимание списка с индексированием / нарезкой списка:

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]]
...