[英]Python StopIteration in generator comprehension
Python 3.6
尝试编写一个返回字符串列表中公共字符串的函数。 例如。
>>>find_common_string(*['test 1', 'test 2', 'test 3'])
会回来
>>>'test '
我试图阻止它在生成器表达式中由StopIteration
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 ^
参考: 检查列表中的所有元素是否相同
如果要让生成器继续退货直到不再满足条件,可以使用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.