将python列表拆分为其他"子列表",即较小的列表

Joh*_*hnJ 166 python python-2.7

我有一个python列表,其中包含1000个.就像是:

data=["I","am","a","python","programmer".....]
Run Code Online (Sandbox Code Playgroud)

其中,len(数据)=说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
Run Code Online (Sandbox Code Playgroud)

是否有一种pythonic方式来完成这项任务?显然我可以使用数据[0:100]等等,但我认为这非常非pythonic且非常低效.

非常感谢.

Dan*_*dux 297

我会说

chunks = [data[x:x+100] for x in range(0, len(data), 100)]
Run Code Online (Sandbox Code Playgroud)

如果你使用python 3.x xrange()替换python 2.x's xrange(),将上面的代码更改为:

chunks = [data[x:x+100] for x in xrange(0, len(data), 100)]
Run Code Online (Sandbox Code Playgroud)

  • 如果你有一个列表并想要一个列表,那么没有理由去烦恼.它们只有在你想要分割数据流而不创建整个数据时才有意义. (7认同)
  • 我也会这样做.你可以用itertools以更"pythonic的方式"做到这一点,但它会像罪一样难看! (4认同)
  • 使用itertools实际上是不那么pythonic的方式,不是吗? (4认同)

Sve*_*ach 29

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

for i in range(0, len(data), 100):
    chunk = data[i:i + 100]
    ...
Run Code Online (Sandbox Code Playgroud)

如果你想避免复制切片,你可以使用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)
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢回复。我确实想到了你的第一个普通切片解决方案,但后来认为它可能效率太低而且对我来说太天真了..我有点惊讶没有一种Python式的方法(一个衬垫)来完成这个任务:( (2认同)

ins*_*get 10

chunks = [data[100*i:100*(i+1)] for i in range(len(data)/100 + 1)]
Run Code Online (Sandbox Code Playgroud)

这相当于接受的答案.例如,为了便于阅读,缩短为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)]
Run Code Online (Sandbox Code Playgroud)

输出:

[[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]]
Run Code Online (Sandbox Code Playgroud)

  • 这不是被问到的. (2认同)
  • 如果你的数据不能被 10 整除怎么办? (2认同)
  • @AARon 这没关系。最后的列表会更小 (2认同)