【问题标题】:Python StopIteration in generator comprehension生成器理解中的 Python StopIteration
【发布时间】:2017-12-27 00:08:27
【问题描述】:

Python 3.6

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

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

会回来

>>>'test '

我试图阻止它匹配equality(iterator)返回的第一个False之后的任何其他字符串,并在生成器表达式中使用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

【问题讨论】:

    标签: python generator stopiteration


    【解决方案1】:

    如果您想让您的生成器继续返回项目直到不再满足条件,您可以使用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)) 
    

    【讨论】:

    • 甜蜜!不知道,魔术。谢了哥们! -- 比我的想法更漂亮 :)
    • @JamesSchinner 使用这个result = itertools.takewhile(lambda x: len(set(x)) == 1, [i for i in zip(*strings)]) 你可以摆脱你的其他功能。
    • 有一天我自己可能会想到……这是个好主意! len(set(x)) == 1。谢谢!
    【解决方案2】:

    StopIteration 是一个类型

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

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

    其中一种方法 - 使用 itertools.takewhile - 它在第一个不匹配的元素处停止。

    【讨论】:

    • 感谢您的解释。我看到我正在返回StopIteration,有道理
    猜你喜欢
    • 2016-08-05
    • 2016-10-08
    • 2018-03-26
    • 2019-10-04
    • 2021-11-01
    • 2019-04-02
    • 2013-12-19
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多