关于python:我如何按two循环遍历一个列表?

How do I loop through a list by twos?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is the most “pythonic” way to iterate over a list in chunks?

我想循环访问一个python列表并一次处理2个列表项。在另一种语言中是这样的:

1
2
3
4
for(int i = 0; i < list.length(); i+=2)
{
   // do something with list[i] and list[i + 1]
}

最好的方法是什么?


可以在步长为2的范围内使用:

Python 2

1
2
for i in xrange(0,10,2):
  print(i)

Python 3

1
2
for i in range(0,10,2):
  print(i)

注意:在python 2中使用xrange而不是range,因为它生成一个不可重复的对象,而不是整个列表时效率更高。


您还可以使用此语法(L[start:stop:step]

1
2
3
4
5
6
7
8
mylist = [1,2,3,4,5,6,7,8,9,10]
for i in mylist[::2]:
    print i,
# prints 1 3 5 7 9

for i in mylist[1::2]:
    print i,
# prints 2 4 6 8 10

其中第一个数字是开始索引(默认为列表的开始或0),第二个数字是结束切片索引(默认为列表的结束),第三个数字是偏移量或步距。


我认为最简单的就是:

1
2
3
it = iter([1,2,3,4,5,6])
for x, y in zip(it, it):
    print x, y

没有额外的进口货。在我看来,非常优雅。


如果您使用的是python 2.6或更高版本,则可以使用itertools模块中的grouper配方:

1
2
3
4
5
6
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)

这样称呼:

1
2
for item1, item2 in grouper(2, l):
    # Do something with item1 and item2

注意,在python 3.x中,应该使用zip_longest而不是izip_longest


1
2
3
nums = range(10)
for i in range(0, len(nums)-1, 2):
    print nums[i]

有点脏,但它起作用。


这可能不如izip-lost解决方案快(我没有实际测试过它),但它将与python一起工作<2.6(izip-lost在2.6中添加):

1
2
3
4
5
6
7
from itertools import imap

def grouper(n, iterable):
   "grouper(3, 'ABCDEFG') --> ('A,'B','C'), ('D','E','F'), ('G',None,None)"
    args = [iter(iterable)] * n

    return imap(None, *args)

如果你需要早于2.3,你可以用内置的地图代替IMAP。缺点是它不能自定义填充值。


如果你能控制列表的结构,那么最需要做的就是改变它:

1
l=[1,2,3,4]

到:

1
l=[(1,2),(3,4)]

那么,您的循环将是:

1
2
for i,j in l:
    print i, j