Python 生成器理解中的 StopIteration
Python StopIteration in generator comprehension
Python 3.6
尝试编写一个函数,使 return 成为字符串列表中的公共字符串。例如。
>>>find_common_string(*['test 1', 'test 2', 'test 3'])
会return
>>>'test '
我试图阻止它在第一个 False
return 由 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
如果您想让生成器一直返回项目,直到不再满足某个条件,您可以使用 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'>
所以如果你 return 这样 - 你只 return 键入,而不是引发异常。
其中一种方法 - 使用 itertools.takewhile
- 它在第一个不匹配的元素处停止。
Python 3.6
尝试编写一个函数,使 return 成为字符串列表中的公共字符串。例如。
>>>find_common_string(*['test 1', 'test 2', 'test 3'])
会return
>>>'test '
我试图阻止它在第一个 False
return 由 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
如果您想让生成器一直返回项目,直到不再满足某个条件,您可以使用 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'>
所以如果你 return 这样 - 你只 return 键入,而不是引发异常。
其中一种方法 - 使用 itertools.takewhile
- 它在第一个不匹配的元素处停止。