如何循环遍历列表? [复制]
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 np
for 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 循环在遍历列表副本并进行删除时会跳过元素? [复制]