簡體   English   中英

生成器理解中的Python StopIteration

[英]Python StopIteration in generator comprehension

Python 3.6

嘗試編寫一個返回字符串列表中公共字符串的函數。 例如。

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

會回來

>>>'test '

我試圖阻止它在生成器表達式中由StopIteration equality(iterator)返回的第一個FalseStopIteration匹配之后的任何其他字符串

能做到嗎? 我得到: #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 ^

參考: 檢查列表中的所有元素是否相同

如果要讓生成器繼續退貨直到不再滿足條件,可以使用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)) 

StopIteration是一種類型

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

因此,如果您以這種方式返回它-您僅返回類型,而不返回引發的異常。

一種方法-使用itertools.takewhile它在第一個不匹配的元素上停止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM