如何通过两个循环列表?

时间:2010-06-07 14:00:43

标签: python list loops for-loop iteration

  

可能重复:
  What is the most “pythonic” way to iterate over a list in chunks?

我想循环遍历Python列表并一次处理2个列表项。用另一种语言这样的东西:

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

实现这一目标的最佳方法是什么?

7 个答案:

答案 0 :(得分:321)

您可以在步长为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而不是range,因为它在生成可迭代对象时效率更高,而不是整个列表。

答案 1 :(得分:78)

您也可以使用此语法(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),第二个数字是结束切片索引(默认为列表的结尾),第三个数字是偏移量或步长。

答案 2 :(得分:41)

我认为最简单的就是:

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

没有额外的进口或任何东西。在我看来,非常优雅。

答案 3 :(得分:39)

如果您使用的是Python 2.6或更高版本,则可以使用recipe模块中的分组器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

答案 4 :(得分:5)

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

有点脏,但它有效。

答案 5 :(得分:2)

这可能没有izip_longest解决方案那么快(我实际上没有对它进行测试),但是它可以用于python&lt; 2.6(在2.6中添加了izip_longest):

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。缺点是它无法自定义填充值。

答案 6 :(得分:0)

如果您可以控制列表的结构,那么最诡异的事情可能是从以下方面进行更改:

l=[1,2,3,4]

为:

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

然后,你的循环将是:

for i,j in l:
    print i, j