我有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
我该怎么做?
或如果有任何其他解决方案,同时进行迭代,请告知我们。
答案 0 :(得分:5)
如果在循环之前不知道要跳过哪个值,可以使用迭代器,并调用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)
,并且你已经读过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
答案 1 :(得分:2)
我认为最简单的方法就是简单地删除"垃圾"在压缩之前
>>> a = [1,2,3,4,5,6,19,20]
>>> b = [7,8,9,10,11,17,18]
>>> a.remove(5)
>>> a
[1, 2, 3, 4, 6, 19, 20]
>>> zip(a,b)
[(1, 7), (2, 8), (3, 9), (4, 10), (6, 11), (19, 17), (20, 18)]
>>>
如果您的情况比一个值更复杂,您可以这样做:
>>> a = (i for i in a if not i in list_of_excluded_values)
最后,正如sweeneyrod在评论中指出的那样,您可以在使用a
删除垃圾之前获取a_trimmed = a[:]
的副本