加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 11:39:31 所属栏目:Python 来源:网络整理
导读:我有2个列表,a和b.让我们说len(a)= len(b)1.我想同时迭代两个列表,条件.因为,a有额外的垃圾值,它应该从a中跳过该值,但它不应该跳过b中的值.然后,当下一次迭代发生时,a应从下一个元素开始,b前面是相同的初始元素. 示例中的解释. a = [1,2,3,4,5,6,19,20]b = [
我有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,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,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读