python - zip(跳过一个列表中的元素但不跳过其他列表)

时间:2014-12-15 21:13:54

标签: python

我有2个列表,ab。让我们说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

我该怎么做?

如果有任何其他解决方案,同时进行迭代,请告知我们。

2 个答案:

答案 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[:]的副本

相关问题