如何在python中的一个循环中simeltanously运行两个循环

时间:2016-09-29 04:35:35

标签: python

有没有办法将两个循环合二为一?我有:

for getFeature in layerNameValueGetObj.getFeatures():
    for setFeature in layerNameValueSetObj.getFeatures():

我想在一个循环下运行layerNameValueGetObj.getFeatures()layerNameValueSetObj.getFeatures()。我怎么能这样做?

我不想嵌套它们,我想一次获得两个循环列。

3 个答案:

答案 0 :(得分:3)

zip_longest将迭代,直到消耗掉所有列表。对于zip,结果将被截断为最短的迭代器。

from itertools import zip_longest    

for get_feature, set_feature in zip_longest(layerNameValueGetObj.getFeatures(), layerNameValueSetObj.getFeatures()):
    print(get_feature, set_feature)

以下是zipzip_longest输出的示例:

DummyObject设置代码:

class DummyObject:
    def __init__(self, reversed=False, length=10):
        self.reversed = reversed
        self.length = length

    def getFeatures(self):
        if self.reversed:
            g = reversed(range(self.length))
        else:
            g = range(self.length)
        return g

layerNameValueGetObj = DummyObject(False, length=10)
layerNameValueSetObj = DummyObject(True, length=15)

使用zip_longest

运行
from itertools import zip_longest    

for get_feature, set_feature in zip_longest(layerNameValueGetObj.getFeatures(), layerNameValueSetObj.getFeatures()):
    print(get_feature, set_feature)

zip_longest结果:

0 14
1 13
2 12
3 11
4 10
5 9
6 8
7 7
8 6
9 5
None 4
None 3
None 2
None 1
None 0

使用zip

运行
for get_feature, set_feature in zip(layerNameValueGetObj.getFeatures(), layerNameValueSetObj.getFeatures()):
        print(get_feature, set_feature)

zip结果:

0 14
1 13
2 12
3 11
4 10
5 9
6 8
7 7
8 6
9 5

因此,在这种情况下,layerNameValueGetObj有10个要素,而layerNameValueSetObj有15个要素,zip只会处理总共10个要素,其余5个layerNameValueSetObj要素被截断。

使用zip_longest,较短的迭代器将返回None,其中不存在任何元素。 (如上所示)

答案 1 :(得分:2)

itertools.product正是出于此目的

import itertools

for getFeature, setFeature in itertools.product(layerNameValueGetObj.getFeatures(), layerNameValueSetObj.getFeatures()):
    # dostuff

答案 2 :(得分:2)

您可以使用zip

for a, b in zip(list_a, list_b): 
    print a, b