我如何循环遍历一个列表?

可能重复:
什么是在块中迭代列表的最“pythonic”方式?

我想循环一个Python列表,并一次处理两个列表项。 在另一种语言中是这样的:

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

什么是完成这个最好的方法?

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

Python 2

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

Python 3

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

注意:在Python 2中使用xrange而不是范围,因为它更有效,因为它生成一个可迭代的对象,而不是整个列表。

你也可以使用这个语法( L[start:stop:step] ):

 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),第二位是结束索引(默认是列表的结尾),第三位是偏移量或步长。

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

 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) 

这样的电话:

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

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

我认为最简单的就是这个:

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

没有额外的import或什么。 在我看来非常优雅。

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

有点肮脏,但它的作品。

这可能不像izip_longest解决scheme(我没有真正testing它)那么快,但它可以用python <2.6(izip_longest在2.6中添加):

 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。 缺点是它不提供自定义填充值的function。

如果你能控制列表的结构,那么最可怕的事情就是把它从以下变成:

 l=[1,2,3,4] 

至:

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

那么,你的循环将是:

 for i,j in l: print i, j