Есть ли встроенная функция Python такая, что с
vals=[1,2,3,4,5]
тогда foo(vals,2) дает
foo(vals,2)
[[1,2],[3,4],[5]]
Я ищу поведение, которое дает Wolfram Language с
Partition[Range@5, UpTo@2]
{{1, 2}, {3, 4}, {5}}
Попробуйте: n - размер подгруппы. 'l' - список
def groups(l, n): for i in range(0, len(l), n): yield l[i:i + n]
Он не встроен ни в сам язык Python, ни в его стандартную библиотеку, но может быть тем, что вам нужно для функциональности:
Установите стороннюю библиотеку more-itertools (не путать с модулем itertools, который является частью стандартной библиотеки Python), например, с
itertools
pipenv install 'more-itertools >= 2.4'
Тогда вы можете использовать функцию sliced(), которую она обеспечивает:
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() из той же библиотеки вместо нарезки.
chunked()
Вы можете использовать понимание списка с индексированием / нарезкой списка:
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]]