将列表切割成任意长度子列表的切片子列表部分列表的最简单且合理有效的方法是什么?
例如,如果我们的源列表是:
input = [1, 2, 3, 4, 5, 6, 7, 8, 9, ... ]
我们的子列表长度为3然后我们寻求:
output = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], ... ]
同样,如果我们的子列表长度为4,那么我们寻求:
output = [ [1, 2, 3, 4], [5, 6, 7, 8], ... ]
答案 0 :(得分:75)
[input[i:i+n] for i in range(0, len(input), n)] # Use xrange in py2k
其中n
是块的长度。
由于当input
中的元素数量不能被n
整除时,您没有定义新列表的最终元素可能会发生什么,我认为它并不重要:例如,如果n
等于7,你将得到最后一个元素等于2。
答案 1 :(得分:14)
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)
此函数返回所需长度的元组的迭代器:
>>> list(grouper(2, [1,2,3,4,5,6,7]))
[(1, 2), (3, 4), (5, 6), (7, None)]
答案 2 :(得分:9)
真正的pythonic变种(python 3):
list(zip(*(iter([1,2,3,4,5,6,7,8,9]),)*3))
创建一个列表迭代器并将其转换为具有3x相同迭代器的元组,然后解压缩为zip并再次转换为列表。通过zip从每个迭代器中提取一个值,但由于只有一个迭代器对象,所以这三个内部计数器全局增加。
答案 3 :(得分:0)
我喜欢SilentGhost的解决方案。
我的解决方案在python中使用函数式编程:
group = lambda t, n: zip(*[t[i::n] for i in range(n)])
group([1, 2, 3, 4], 2)
给出:
[(1, 2), (3, 4)]
这假设输入列表大小可以被组大小整除。如果不是,则不包括未配对的元素。