Разделите список python на другие "подсписки", т. е. меньшие списки [дубликат]


этот вопрос уже есть ответ здесь:

у меня есть список python, который работает в 1000-х. Что-то вроде:

data=["I","am","a","python","programmer".....]

где, лен (данные)= говорят 1003

теперь я хотел бы создать подмножество этого списка (данных) путем разделения список ребрышки на куски по 100. Итак, в конце концов, я хотел бы иметь что-то вроде:

data_chunk1=[.....] #first 100 items of list data
data_chunk2=[.....] #second 100 items of list data
.
.
.
data_chunk11=[.....] # remainder of the entries,& its len <=100, len(data_chunk_11)=3

есть ли подходящие для Python способ достижения этой задачи? Очевидно, я могу использовать данные[0:100] и т. д., Но я предполагаю, что это жутко не подходящие для Python и очень неэффективно.

большое спасибо.

3 122

3 ответа:

Я бы сказал

chunks = [data[x:x+100] for x in xrange(0, len(data), 100)]

если вы используете python 3.x range() заменяет python 2.х xrange() изменение выше код:

chunks = [data[x:x+100] for x in range(0, len(data), 100)]

на самом деле я думаю, что использование простых срезов является лучшим решением в этом случае:

for i in range(0, len(data), 100):
    chunk = data[i:i + 100]
    ...

если вы хотите избежать копирования срезов, вы можете использовать itertools.islice(), но это не кажется необходимым здесь.

The itertools() документация также содержит знаменитый шаблон "grouper":

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

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

chunks = [data[100*i:100*(i+1)] for i in range(len(data)/100 + 1)]

Это эквивалентно принятому ответу. Например, сокращение до 10 партий для удобства чтения:

data = range(35)
print [data[x:x+10] for x in xrange(0, len(data), 10)]
print [data[10*i:10*(i+1)] for i in range(len(data)/10 + 1)]

выходы:

[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34]]
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34]]