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您可以将列表理解转换为生成器理解,这样就可以懒散地进行排除。