生成器理解中的Python StopIteration

时间:2017-07-21 04:51:27

标签: python generator stopiteration

Python 3.6

尝试编写一个函数,该函数返回字符串列表中的公共字符串。例如。

>>>find_common_string(*['test 1', 'test 2', 'test 3'])

将返回

>>>'test '

我尝试阻止它在False返回的第一个equality(iterator)与生成器表达式中的StopIteration之后匹配任何其他字符串

可以这样做吗?我得到:#comparing a few long strings

TypeError: sequence item 130: expected str instance, type found

这是代码:

def equality(iterator):
    iterator = iter(iterator)
    try:
        first = next(iterator)
    except StopIteration:
        return True
    return all(first == rest for rest in iterator)

def find_common_string(*strings):
    result = zip(*strings)      
    result = (i[0] if equality(i) else StopIteration for i in result)
    return ''.join(result) #I tried to use this ^

参考文献: check if all elements in a list are identical

2 个答案:

答案 0 :(得分:3)

如果您想让发电机继续退货,直到不再符合条件,您可以使用itertools.takewhile。您的问题需要稍作修改:

import itertools

def find_common_string(*strings): 
    result = itertools.takewhile(lambda x: equality(x), [i for i in zip(*strings)])
    return ''.join((i[0] for i in result)) 

答案 1 :(得分:1)

StopIteration是一种类型

>>> print(type(StopIteration))
<class 'type'>

所以如果你以这种方式返回它 - 你只返回类型,但不是引发异常。

其中一种方式 - 使用itertools.takewhile - 它会在第一个非匹配元素上停止。