拆分python列表到其他“子列表”,即较小的列表

我有一个运行到1000年的Python列表。 就像是:

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

len(data)= 1003

我现在想创build这个列表(数据)的一个子集,通过将原始列表分成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 

有没有pythonic方式来完成这个任务? 显然我可以使用数据[0:100]等,但我认为这是非pythonic非常低效率。

非常感谢。

我会说

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

如果你正在使用python 3.x range()replacepython 2.x的xrange() ,将上面的代码改为:

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

其实我觉得在这种情况下使用普通切片是最好的解决scheme:

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

如果你想避免复制切片,你可以使用itertools.islice() ,但在这里似乎没有必要。

itertools()文档还包含着名的“石斑鱼”模式:

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

你需要修改它来正确对待最后一个块,所以我认为使用plain slice的直接解决scheme是可取的。

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