2010-07-06 3 views
0

Можно создать дубликат:
How do you split a list into evenly sized chunks in 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 

Пример usag е:

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

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

Это похоже, но не то же самое на этот пост в How to split a list into a given number of sub-lists in python

Благодарности

EDIT: Как прокомментировал Анураг Uniyal, это дубликат How do you split a list into evenly sized chunks?, и должно быть закрыто, которого я не могу сделать.

+2

http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks-in-python/312467#312467 – kennytm

+0

Почему другие, казалось бы, повторяющиеся вопросы не являются похоже на ваш вопрос? –

+0

извините, когда я его искал, я не совсем понял, что это можно назвать – skeggse

ответ

9

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

Пример:

>>> 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]] 
>>> 
+0

IMO это самое питоническое решение. –

+0

Да, на самом деле, используя шаг диапазона, это лучший способ, чем мой первоначальный подход. – Amber

+1

+1: Определенно самый явный и понятный способ разбить список! Это также, вероятно, быстрее, чем перестроение подписок с помощью списков. – EOL

1
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))) 
+1

Вы действительно пытались запустить этот код? Кроме того, не назовите свой параметр «list». – kennytm

+0

Это не работает, list_split ([0, 1, 2, 3, 4, 5, 6], 2) не должен возвращаться [[0, 1], [2], []] – skeggse

+0

К сожалению, опечатка (забыл парсеры вокруг 'i + 1'). Починю. – Amber

0
from itertools import izip_longest 

def list_split(L, size): 
    return [[j for j in i if j is not None] for i in izip_longest(*[iter(L)]*size)] 

>>> 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]] 
>>> list_split([0, 1, 2, 3, 4, 5, 6], 4) 
[[0, 1, 2, 3], [4, 5, 6]] 
>>> list_split([0, 1, 2, 3, 4, 5, 6], 5) 
[[0, 1, 2, 3, 4], [5, 6]] 
+0

Это очень похоже на рецепт grouper() itertools, но удаление отступов делает его немного запутанным. – tokland

1

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

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))) 

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

+0

N.B. Если вы забудете 'iter' из' iter (mylist) ', то итератор, возвращаемый' grouper', никогда не остановится! Поэтому всегда передавайте итератору эту функцию. Если вы передадите список с именем L, 'islice (L, n)' будет возвращать первые N элементов L каждый раз, когда он вызывается. Поэтому, если L не пуст, '' [] 'сторож никогда не будет достигнут. –