在Python中同时迭代列表中的两个值

69

我有一个类似 (669256.02, 6117662.09, 669258.61, 6117664.39, 669258.05, 6117665.08) 的集合,我需要对其进行迭代,例如:

    for x,y in (669256.02, 6117662.09, 669258.61, 6117664.39, 669258.05, 6117665.08)
        print (x,y)

会打印出

    669256.02 6117662.09
    669258.61 6117664.39
    669258.05 6117665.08

我在使用 Python 3.3。


还有Python中的“Every Other Element”习惯用法。 - Martijn Pieters
你是对的,这是一个重复。真是尴尬...但还是谢谢你! - Rasmus Damgaard Nielsen
2
不同意重复:每两个子情况都有一个简单而体面的iter()解决方案,由Ashwini提供。 - Ciro Santilli OurBigBook.com
3个回答

122

你可以使用迭代器:

>>> lis = (669256.02, 6117662.09, 669258.61, 6117664.39, 669258.05, 6117665.08)
>>> it = iter(lis)
>>> for x in it:
...     print (x, next(it))
...     
669256.02 6117662.09
669258.61 6117664.39
669258.05 6117665.08

19
如果列表中有奇数个项目,则会引发一个 StopIteration 异常。 - user3064538
请注意,这会有副作用,改变循环体内的迭代器。 - keithpjolley

37
>>> nums = (669256.02, 6117662.09, 669258.61, 6117664.39, 669258.05, 6117665.08)
>>> for x, y in zip(*[iter(nums)]*2):
        print(x, y)


669256.02 6117662.09
669258.61 6117664.39
669258.05 6117665.08

10
哇,这几乎难以阅读,可以认为它是一种黑客技巧。对此打负分。不过,因为简洁而加1分。 - Alfe
11
@Alfe 请阅读官方的Python文档:http://docs.python.org/2/library/functions.html#zip ... 特别是这部分内容:“这使得使用zip(*[iter(s)]*n)将数据系列聚合到长度为n的组成为一种惯用语。” - jamylak
24
阅读这样的文件后,我会对文件提出与您相同的看法。每当一个黑客被认为足够可行时,它被称为习语。但这并不意味着它易读可懂 ;-) - Alfe
4
好的,我同意你的看法。Python文档显然是错误的,我们不应该听从它的建议。 - jamylak
4
显然,对于同一件事情的看法不止一种。 - Alfe
显示剩余9条评论

14

itertools的示例代码中,grouper示例应该对你有所帮助: http://docs.python.org/library/itertools.html#itertools-recipes

from itertools import zip_longest
def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

然后您将像这样使用它:

for x, y in grouper(my_set, 2, 0.0):  # Use 0.0 to pad with a float
    print(x, y)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接