我有一个运行到1000的python列表。喜欢的东西:

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

len(data)= 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的方法来实现这个任务?显然,我可以使用data[0:100]等等,但我假设这是非常非python的,效率非常低。

多谢。


当前回答

实际上,我认为在这种情况下使用普通切片是最好的解决方案:

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)

您需要修改它以正确地处理最后一个块,因此我认为使用普通切片的直接解决方案更可取。

其他回答

实际上,我认为在这种情况下使用普通切片是最好的解决方案:

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)

您需要修改它以正确地处理最后一个块,因此我认为使用普通切片的直接解决方案更可取。

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

我想说的

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

如果你使用的是python 2。X而不是3。X,你可以通过使用xrange()来提高内存效率,将上面的代码更改为:

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