【问题标题】:How do I loop through a list by twos? [duplicate]如何循环遍历列表? [复制]
【发布时间】:2011-02-28 17:27:05
【问题描述】:

我想遍历一个 Python 列表并一次处理 2 个列表项。类似这样的另一种语言:

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

最好的方法是什么?

【问题讨论】:

标签: python list loops for-loop iteration


【解决方案1】:

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

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。值得注意的是,您正在描述 Python 2 的 xrange 和 range。在 Python 3 中,range() 生成一个可迭代对象。
  • 在 Python 3 中,range() 有一个可选步长,而 xrange() 不再存在
  • 浮点值呢?我收到integer argument expected, got float 的错误
  • @KevinPatel 只是做 int(your_float_var) 也许?
  • @RoelVandePaar,不,那仍然是一个整数。其实我找到了答案。 import numpy as npfor i in np.arange(-3.14, 3.14, 0.1): print (i)
【解决方案2】:

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

【讨论】:

  • 只要list 不是很大,这将非常有效。如果list 很大,那么当您使用切片语法时,您正在制作它的副本...
  • 使用参数时你的回答对我有好处:range(my_param)[::2]
  • 我喜欢这个隐含的范围。您没有获得列表的长度来将其与变量进行比较。
  • 这对我来说是最好的答案,在我的预设列表中,每隔一个项目就是前一个(主要项目)的信息。我只需要遍历主要项目。这个答案确实可以。
【解决方案3】:

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

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

Out: 1 2
     3 4
     5 6

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

【讨论】:

  • 这并不完全符合这个问题的要求。
  • 当然它不完全符合这个问题,但它确实符合我的要求。也不错。
  • 为什么要用iter,没必要?
  • 这不回答 OP。
  • 是的,我明白了,我的评论是错误的。迭代器使对象依次迭代。
【解决方案4】:

如果您使用的是 Python 2.6 或更高版本,则可以使用 itertools 模块中的 grouper recipe

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

【讨论】:

  • +1 这是文档本身建议的方法。
  • 如果您想知道它是如何工作的,请考虑 args 中的所有迭代器一起前进,以便 izip 在其参数上调用 next() 时始终采用下一个元素
【解决方案5】:
nums = range(10)
for i in range(0, len(nums)-1, 2):
    print nums[i]

有点脏,但可以。

【讨论】:

  • 考虑到range/xrange 内置了对更改增量值的支持,这个解决方案似乎有点傻。
  • 嗯,这就是range 的最后一个参数在做什么......
  • 假定 nums 是我们无法控制的序列。演示实际上是在我为 nums 赋值的第一行之后开始的。
【解决方案6】:

这可能没有 izip_longest 解决方案那么快(我没有实际测试过),但它适用于 python

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

【讨论】:

    【解决方案7】:

    如果您可以控制列表的结构,最pythonic 的做法可能是将其更改为:

    l=[1,2,3,4]
    

    到:

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

    然后,您的循环将是:

    for i,j in l:
        print i, j
    

    【讨论】:

    • 这是一个从外部文件读入的属性。我无法控制列表,实际上我正在尝试将其从 l=[1,2,3,4] 更改为 l=[(1,2),(3,4)] 这就是我问这个问题的原因
    猜你喜欢
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    相关资源
    最近更新 更多