有没有办法将两个循环合二为一?我有:
for getFeature in layerNameValueGetObj.getFeatures():
for setFeature in layerNameValueSetObj.getFeatures():
我想在一个循环下运行layerNameValueGetObj.getFeatures()
和layerNameValueSetObj.getFeatures()
。我怎么能这样做?
我不想嵌套它们,我想一次获得两个循环列。
答案 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)
以下是zip
和zip_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