Разделить список python на другие "подсписки", т.е. Более мелкие списки
У меня есть список python, который запускается в 1000. Что-то вроде:
data=["I","am","a","python","programmer".....]
где, len (data) = say 1003
Теперь я хотел бы создать подмножество этого списка (данных), разделив исходный список на куски размером 100. Таким образом, в конце Id хотел бы иметь что-то вроде:
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
Существует ли питонический способ достижения этой задачи? Очевидно, что я могу использовать данные [0: 100] и т.д., Но я предполагаю, что это ужасно непитоновое и очень неэффективное.
Большое спасибо.
Ответы
Ответ 1
Я бы сказал
chunks = [data[x:x+100] for x in xrange(0, len(data), 100)]
Если вы используете python 3.x range()
, замените python 2.x xrange()
, изменив приведенный выше код на:
chunks = [data[x:x+100] for x in range(0, len(data), 100)]
Ответ 2
На самом деле, я думаю, что использование простых срезов - лучшее решение в этом случае:
for i in range(0, len(data), 100):
chunk = data[i:i + 100]
...
Если вы хотите избежать копирования фрагментов, вы можете использовать itertools.islice()
, но здесь это не представляется необходимым.
Документация 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)
Вам нужно будет изменить его, чтобы правильно обработать последний кусок, поэтому я думаю, что прямолинейное решение с использованием простых фрагментов предпочтительнее.
Ответ 3
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]]