如何循环遍历列表? [复制]

Posted

技术标签:

【中文标题】如何循环遍历列表? [复制]【英文标题】: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]

最好的方法是什么?

【问题讨论】:

看看这个问题的答案:***.com/questions/434287/… 你用的是什么版本的 Python? 【参考方案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)] 这就是我问这个问题的原因

以上是关于如何循环遍历列表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Python列表操作:遍历、range()、列表解析、列表切片、列表复制、元组

为啥 Python for 循环在遍历列表副本并进行删除时会跳过元素? [复制]

python 如何在一个for循环中遍历两个列表

循环遍历过滤的单元格列表以检查值是不是出现在另一列中,然后复制/粘贴

如何循环遍历 Java 中的枚举? [复制]

如何循环遍历 Perl 目录中的文件? [复制]