Python中从列表中获取n个项目组的惯用方法?

Python中从列表中获取n个项目组的惯用方法?,python,iteration,Python,Iteration,给你一张单子 A = [1 2 3 4 5 6] 是否有任何惯用的(Pythonic)方式来迭代它 B = [(1, 2) (3, 4) (5, 6)] 除了索引?这感觉像是C的遗留问题: for a1,a2 in [ (A[i], A[i+1]) for i in range(0, len(A), 2) ]: 我忍不住觉得应该有一些聪明的黑客使用itertools或切片之类的工具 (当然,一次两个只是一个例子;我想要一个适用于任何n的解决方案。) 编辑:相关,但即使是最干净的解决方案(接

给你一张单子

A = [1 2 3 4 5 6]
是否有任何惯用的(Pythonic)方式来迭代它

B = [(1, 2) (3, 4) (5, 6)]
除了索引?这感觉像是C的遗留问题:

for a1,a2 in [ (A[i], A[i+1]) for i in range(0, len(A), 2) ]:
我忍不住觉得应该有一些聪明的黑客使用itertools或切片之类的工具

(当然,一次两个只是一个例子;我想要一个适用于任何n的解决方案。)

编辑:相关,但即使是最干净的解决方案(接受,使用zip),如果没有列表理解和*-符号,也不能很好地推广到更高的n。

来自:


我认为你的C延迟看起来没那么糟糕,但是我会写
A[I:I+1]
而不是
A[I],A[I+1]
。更容易扩展到任意的
n
。复制:在块中迭代列表的最“pythonic”的方式是什么?另请参见,它实际上有一个干净、无拷贝的解决方案,并且不需要列表理解或*-符号。最后,您将希望在某个地方循环数据,这样任何循环/理解/生成器都不会额外付费。如果您喜欢,可以将引用的基于itertools.islice的解决方案封装到一个函数中。这可能不是主观习惯用法,也可能不会避免列表理解和*符号,但它“pythonic”足以出现在文档中。啊,我知道它存在于某个地方。非常感谢。
from itertools import izip_longest
def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

i = grouper(3,range(100))
i.next()
(0, 1, 2)