我想一次遍历一个Python列表并处理2个列表项。在另一种语言中是这样的:
for(int i = 0; i < list.length(); i+=2) { // do something with list[i] and list[i + 1] }
实现这一目标的最佳方法是什么?
如果你使用的是Python 2.6或更新版本,你可以使用< >强itertools < / >强模块中的grouper 配方:
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。
zip_longest
izip_longest
你可以使用步长为2的range:
range
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,因为它更有效,因为它生成一个可迭代对象,而不是整个列表。
xrange
如果你可以控制列表的结构,最python化的做法可能是将其更改为:
l=[1,2,3,4]
:
l=[(1,2),(3,4)]
然后,你的循环将是:
for i,j in l: print i, j
你也可以使用这个语法(L[start:stop:step]):
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),第二个是结束切片索引(默认为列表的结束),第三个数字是偏移量或步长。
nums = range(10) for i in range(0, len(nums)-1, 2): print nums[i]
有点脏,但是有用。
这可能没有izip_longest解决方案那么快(我实际上没有测试它),但它将与python <2.6 (izip_longest在2.6中添加):
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。缺点是它不提供自定义填充值的功能。
在我看来,最简单的就是:
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
没有额外的进口或任何东西。在我看来,非常优雅。