在两个大小不同的列表上迭代时处理StopIteration异常

2024-09-28 23:21:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我想迭代两个大小不同的列表,但速度不一样(我只找到并行迭代的答案)。例如,考虑两个包含相同类型元素的排序列表,我想根据元素只在一个列表中或在两个列表中,使用两个列表的公共遍历对元素执行操作。在

我知道如何使用索引来做到这一点,但是有没有一种方法可以用迭代器正确地做到这一点呢?在

我有一些关于:

list1=[...]
list2=[...]

it1=iter(list1)
it2=iter(list2)
try:
    while True:
        e1=it1.next()
        e2=it2.next()

        while compare(e1,e2):
            doSomething1(e1)
            e1=it1.next()

        while compare(e2,e1):
            doSomething2(e2)
            e2=it2.next()

        doSomething3(e1,e2)
except StopIteration:
    pass

# do something with the rest of the list that is at end

当引发StopIteration时,我不知道哪个列表在末尾,也不知道如何访问其余元素:调用next()检查异常将使我跳过较长列表中的一个元素,直接访问e1或e2将使我再次访问较短列表中的最后一个元素。在

我可以想象出几种解决方法,比如在每个next()中使用try/except,但我的所有想法似乎都比使用索引更复杂。。。在

对于上面代码的一个简单的工作示例,可以使用

^{pr2}$

Tags: 方法元素列表nextcomparetryexceptiter
1条回答
网友
1楼 · 发布于 2024-09-28 23:21:13

迭代器有一个__length_hint__,它将返回(估计)要迭代的剩余元素的数量。它的准确性取决于迭代器的类型,我不能保证它能在非CPython实现上工作。在

x = [1,2,3,4,5]
y = iter(x)
print y.__length_hint__() # prints 5
print y.next # prints 1
...

在StopIteration捕获中,您可以检查哪个迭代器具有剩余成员,并基于该成员执行操作。在

^{pr2}$

相关问题 更多 >