Разделение / разбиение списка Python

Возможный дубликат:
Как разделить список на части одинакового размера в Python?

Привет,

Я пытаюсь найти более простой способ сделать следующее:

def list_split(list, size):
  result = [[]]
  while len(list) > 0:
    if len(result[-1]) >= size: result.append([])
    result[-1].append(list.pop(0))
  return result

Пример использования:

>>> list_split([0, 1, 2, 3, 4, 5, 6], 2)
[[0, 1], [2, 3], [4, 5], [6]]
>>> list_split([0, 1, 2, 3, 4, 5, 6], 3)
[[0, 1, 2], [3, 4, 5], [6]]

Я не могу сказать, есть ли встроенный способ сделать это, возможно, с нарезкой или чем-то еще.

Это похоже, но не то же самое, что и сообщение в Как разбить список на заданное количество подсписок в python

Спасибо

ИЗМЕНИТЬ: как прокомментировал Anurag Uniyal, это дубликат Как разделить список на части одинакового размера? и закрыть его, чего я сделать не могу.


person skeggse    schedule 06.07.2010    source источник
comment
stackoverflow.com/questions/312443/   -  person kennytm    schedule 06.07.2010
comment
почему другие, казалось бы, повторяющиеся вопросы не похожи на ваш вопрос?   -  person Anurag Uniyal    schedule 06.07.2010
comment
извините, когда я искал это, я не совсем понимал, как это можно назвать   -  person skeggse    schedule 06.07.2010


Ответы (4)


Вы можете использовать срезы для получения подмножеств списка.

Пример:

>>> L = [0, 1, 2, 3, 4, 5, 6]
>>> n = 3
>>> [L[i:i+n] for i in range(0, len(L), n)]
[[0, 1, 2], [3, 4, 5], [6]]
>>>
person Nick Dandoulakis    schedule 06.07.2010
comment
ИМО, это самое питоническое решение. - person Tim Pietzcker; 06.07.2010
comment
Да, на самом деле, использование шага диапазона - лучший способ, чем мой первоначальный подход. - person Amber; 06.07.2010
comment
+1: Определенно самый явный и понятный способ разбить список! Это также, вероятно, быстрее, чем перестроение подсписков через понимание списков. - person Eric O Lebigot; 06.07.2010
comment
Эээ, это использует понимание, EOL. - person Amber; 06.07.2010

У вас есть простое функциональное решение в рецептах itertools (grouper):

http://docs.python.org/library/itertools.html#recipes

В то время как эта функция добавляет заполнение, вы можете легко написать реализацию без дополнения, воспользовавшись встроенным (обычно упускаемым из виду) iter, используемым следующим образом: iter(callable, sentinel) -> iterator

def grouper(n, it):
  "grouper(3, 'ABCDEFG') --> ABC DEF G"
  return iter(lambda: list(itertools.islice(it, n)), [])

list(grouper(3, iter(mylist)))

Эти решения являются более общими, поскольку они работают как с последовательностями, так и с итерациями (даже если они бесконечны).

person tokland    schedule 06.07.2010
comment
N.B. Если вы забудете iter из iter(mylist), то итератор, возвращаемый grouper, никогда не остановится! Поэтому всегда передавайте итератор этой функции. Если вы передадите список с именем L, islice(L, n) будет возвращать первые N элементов L каждый раз, когда он вызывается. Таким образом, если L не пусто, [] дозорный никогда не будет достигнут. - person Cristian Ciupitu; 18.09.2010

def list_split(L, size):
    return [L[i*size:(i+1)*size] for i in range(1+((len(L)-1)//size))]

Если вы предпочитаете генератор вместо списка, вы можете заменить скобки скобками, например:

def list_split(L, size):
    return (L[i*size:(i+1)*size] for i in range(1+((len(L)-1)//size)))
person Amber    schedule 06.07.2010
comment
Вы действительно пробовали запустить этот код? Также, пожалуйста, не называйте свой список параметров. - person kennytm; 06.07.2010
comment
Это не работает, list_split ([0, 1, 2, 3, 4, 5, 6], 2) не должен возвращать [[0, 1], [2], []] - person skeggse; 06.07.2010
comment
Извините, опечатка (забыл скобки вокруг i+1). Починю. - person Amber; 06.07.2010
comment
(Кенни, единственная причина для наименования параметров заключалась в том, чтобы отразить определение OP.) - person Amber; 06.07.2010
comment
По-прежнему не работает, list_split ([0, 1, 2, 3, 4, 5, 6], 2) не должен возвращать [[0, 1], [2, 3], [4, 5]] ( см. исходный пост) - person skeggse; 06.07.2010
comment
@Amber: Хорошо, @CMC, пожалуйста, не называйте свой список параметров. - person kennytm; 06.07.2010
comment
@Amber: Теперь это работает @KennyTM: Я понимаю, что список - плохое имя для переменной, так как это тоже тип, но для удобства чтения и простоты я изменил его на список. - person skeggse; 06.07.2010
comment
Пожалуйста, переименуйте list в L. Это имя параметра / переменной Pythonic. - person Cristian Ciupitu; 18.09.2010

person    schedule
comment
Это очень похоже на рецепт grouper () для itertools, но удаление отступов делает его немного запутанным. - person tokland; 06.07.2010