Разделите список на куски одинакового размера, не потеряв оставшихся элементов в последний раз?

86
11

Если у меня есть список:

x = [1,2,3,4,5,6,7,8,9,10]

Есть ли функция или пакет, который позволяет указать длину комбинаций, которые вам интересны, без потери оставшихся элементов списка?

Например, если бы меня интересовали все комбинации длины 4, я мог бы вернуть что-то вроде:

[[1,2,3,4],[5,6,7,8],[9,10]]
[[1,2,3,4],[5,6,7,8],[9],[10]]

Я использую itertools.combination чтобы получить первый список, что здорово, но я ищу способ сохранить информацию о оставшемся списке.

ПРИМЕЧАНИЕ. Я не ищу, чтобы кто-нибудь написал для меня код, чтобы решить его, если это необходимо. Я просто прошу, чтобы кто-то знал о подобной функции, которая могла бы помочь.

спросил(а) 2017-09-25T00:57:00+03:00 2 года, 9 месяцев назад
1
Решение
77

Вы можете использовать get_chunks(iterable_obj, chunk_size) сторонней библиотеки open-source utilspie для достижения этой цели как:

>>> from utilspie import iterutils
>>> x = [1,2,3,4,5,6,7,8,9,10]

# v type-cast it to 'list' as 'get_chunks' returns the generator object
>>> list(iterutils.get_chunks(x, 4))
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]

utilspie доступен на pip, и для установки выполните:

# For Python 2.x
pip install utilspie

# For python 3.x
pip3 install utilspie

Отказ от ответственности: я являюсь создателем этой библиотеки: https://github.com/moin18/utilspie

ответил(а) 2017-09-25T01:03:00+03:00 2 года, 9 месяцев назад
54

Вы можете использовать больше-itertools и его функцию sliced sliced().

>>> import more_itertools
>>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(more_itertools.sliced(x, 4))
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]

ответил(а) 2017-09-25T01:35:00+03:00 2 года, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема