我有2个列表,a和b.让我们说len(a)= len(b)1.我想同时迭代两个列表,条件.因为,a有额外的垃圾值,它应该从a中跳过该值,但它不应该跳过b中的值.然后,当下一次迭代发生时,a应从下一个元素开始,b前面是相同的初始元素.
示例中的解释.
a = [1,2,3,4,5,6,19,20]
b = [7,8,9,10,11,17,18]
for x,y in zip(a,b):
if x == 5: # some condition
#in this case y is 11
continue # skip the value 5 from a but dont skip 11 from b.
print x,y
预期的产出将是
1 7
2 8
3 9
4 10
6 11 # 5 skipped because of some condition, but 11 remains intact
19 17
20 18
我该怎么做?
或者如果有任何其他解决方案,同时迭代,请告诉我.
最佳答案 如果在循环之前不知道要跳过哪个值,则可以使用迭代器,然后调用next来丢弃值:
import itertools
a = [1,2,3,4,5,6,19,20]
b = [7,8,9,10,11,17,18]
it_a = iter(a)
it_b = iter(b)
for x,y in itertools.izip(it_a, it_b):
if x == 5:
x = next(it_a)
print x,y
这使:
1 7
2 8
3 9
4 10
6 11
19 17
20 18
但要小心.如果你调用next(it_a),并且你已经从迭代器中读取了所有的值,那么你将得到一个StopIteration异常,你可能想以某种方式处理它.另外,请注意,如果你以某种方式跳过a的两个元素,那么a将在b之前耗尽元素,并且zip将在生成b的最后一个元素之前静默停止.
或者,如果您在进入for循环之前确实知道要排除的内容,那么您可以基本上完成@wnnmaw在下面建议的内容,但使用生成器理解而不是列表理解.这将懒惰地排除:
a = [1,2,3,4,5,6,19,20]
b = [7,8,9,10,11,17,18]
it_a = (x for x in a if x not in {5, 42, 101})
for x,y in zip(it_a, b):
print x,y