如何通过两个循环列表?

fro*_*die 231 python iteration loops for-loop list

可能重复:
以块的形式迭代列表的最"pythonic"方法是什么?

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

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

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

Bri*_*ndy 346

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

Python 2

for i in xrange(0,10,2):
  print(i)
Run Code Online (Sandbox Code Playgroud)

Python 3

for i in range(0,10,2):
  print(i)
Run Code Online (Sandbox Code Playgroud)

注意:在Python 2中使用xrange而不是range,因为它在生成可迭代对象时效率更高,而不是整个列表.

  • +1.值得注意的是,您正在描述Python 2的xrange和范围.在Python 3中,range()生成一个可迭代对象. (34认同)
  • 在Python 3中,range()具有可选的步长,xrange()不再存在 (7认同)
  • @RoelVandePaar,不,这仍然是一个整数。其实我找到了答案。`将 numpy 导入为 np` `for i in np.arange(-3.14, 3.14, 0.1): print (i)` (3认同)

jat*_*ism 84

您也可以使用此语法(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
Run Code Online (Sandbox Code Playgroud)

第一个数字是起始索引(默认为列表的开头或0),第二个数字是结束切片索引(默认为列表的结尾),第三个数字是偏移量或步长.

  • 只要`list`不是很大,这将非常有效.如果`list` _is_很大,那么当你使用切片语法时,你正在复制它... (6认同)

car*_*arl 45

我认为最简单的就是:

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

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

  • 当然它不完全符合这个问题,但确实完全符合我的要求.很好. (8认同)
  • 这不是这个问题所要求的. (6认同)
  • 为什么不使用`iter`呢? (3认同)
  • 是的,我明白了,我的评论是错误的。iter使得对象依次迭代。 (2认同)

Mar*_*ers 41

如果你正在使用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)
Run Code Online (Sandbox Code Playgroud)

像这样打电话:

for item1, item2 in grouper(2, l):
    # Do something with item1 and item2
Run Code Online (Sandbox Code Playgroud)

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


Ish*_*eck 5

nums = range(10)
for i in range(0, len(nums)-1, 2):
    print nums[i]
Run Code Online (Sandbox Code Playgroud)

有点脏但是可以用。

  • 嗯,这就是`range`的最后一个参数正在做的... (2认同)