将列表切片到子列表列表中

Jam*_*tin 32 python list

将列表切割成任意长度子列表的切片子列表部分列表的最简单且合理有效的方法是什么?

例如,如果我们的源列表是:

input = [1, 2, 3, 4, 5, 6, 7, 8, 9, ... ]
Run Code Online (Sandbox Code Playgroud)

我们的子列表长度为3然后我们寻求:

output = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], ... ]
Run Code Online (Sandbox Code Playgroud)

同样,如果我们的子列表长度为4,那么我们寻求:

output = [ [1, 2, 3, 4], [5, 6, 7, 8], ... ]
Run Code Online (Sandbox Code Playgroud)

Sil*_*ost 75

[input[i:i+n] for i in range(0, len(input), n)]        # Use xrange in py2k
Run Code Online (Sandbox Code Playgroud)

n大块的长度在哪里.

既然你没有定义新列表的最后一个元素可能会发生什么,当元素的数量input不能被整除时n,我认为它并不重要:如果n等于7,你将得到最后一个元素等于2 ,例如.


sth*_*sth 14

itertools模块的文档包含以下配方:

import itertools

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

此函数返回所需长度的元组的迭代器:

>>> list(grouper(2, [1,2,3,4,5,6,7]))
[(1, 2), (3, 4), (5, 6), (7, None)]
Run Code Online (Sandbox Code Playgroud)

  • @SilentGhost,过早优化? (3认同)
  • @Mike:请原谅? (2认同)

CoD*_*anX 9

一个真正的pythonic变种(python 3):

list(zip(*(iter([1,2,3,4,5,6,7,8,9]),)*3))
Run Code Online (Sandbox Code Playgroud)

创建一个列表迭代器并将其转换为具有3x相同迭代器的元组,然后解压缩为zip并再次转换为列表.通过zip从每个迭代器中提取一个值,但由于只有一个迭代器对象,所以三个内部计数器全局增加.

  • 这个解决方案很棒,但如果我不得不考虑python的禅,我会说它不是非常"pythonic":P (3认同)