Split a python list into other “sublists” i.e smaller lists
本问题已经有最佳答案,请猛点这里访问。
我有一个python列表,它有1000个。类似于:
1 | data=["I","am","a","python","programmer".....] |
其中,len(数据)=say 1003
我现在想创建这个列表(数据)的一个子集,方法是将原始列表分割成100块。所以,最后,我想说:
1 2 3 4 5 6 | 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式的,效率非常低。
多谢。
我会说
1 | chunks = [data[x:x+100] for x in xrange(0, len(data), 100)] |
如果您使用的是python 3.x
1 | chunks = [data[x:x+100] for x in range(0, len(data), 100)] |
实际上,我认为在这种情况下,使用普通切片是最好的解决方案:
1 2 3 | for i in range(0, len(data), 100): chunk = data[i:i + 100] ... |
如果您想避免复制切片,可以使用
1 2 3 4 | def grouper(n, iterable, fillvalue=None): "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" args = [iter(iterable)] * n return izip_longest(fillvalue=fillvalue, *args) |
您需要修改它以正确地处理最后一个块,所以我认为使用普通片的直接前进解决方案更可取。
1 | chunks = [data[100*i:100*(i+1)] for i in range(len(data)/100 + 1)] |
这相当于公认的答案。例如,为了可读性,缩短到10批:
1 2 3 | 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)] |
输出:
1 2 | [[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]] |