Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-zip(跳过一个列表中的元素,但不跳过另一个列表中的元素)_Python - Fatal编程技术网

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

python-zip(跳过一个列表中的元素,但不跳过另一个列表中的元素),python,Python,我有两个列表,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

我有两个列表,
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
我怎么做


如果有任何其他解决方案,请在同时迭代时告诉我。

我认为最简单的方法是在压缩之前简单地删除“垃圾”

>>> 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_trimmed=a[:]

删除垃圾之前,您可以复制一份
a
,如果您在循环中之前不知道要跳过哪个值,您可以使用迭代器,然后调用
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

你能显示预期的输出吗?如果需要,你可以在删除列表之前复制它,这样它就不会被更改。我也想到了这一点,但要做到这一点,我首先需要找到索引5,然后删除它,这可能会很昂贵@user1162512,
list.remove(x)
删除值为
x
的列表元素,因此您不需要查找索引,但我提供的示例只是一个伪示例,如果根据某些条件,垃圾值最终位于第9个索引/4个索引/100个索引,依此类推。我首先必须遍历列表以找到垃圾值的索引,然后删除它,然后执行
zip
操作。这可能代价高昂,即首先迭代查找垃圾值的索引,然后删除它,然后再压缩。这就是为什么我拒绝了这个解决方案,我最初认为。@user1162512您可以将列表理解转换为生成器理解,这样就可以懒散地进行排除。