当我试图回答一个关于代码评审的问题时,我意识到我的解决方案是有缺陷的。代码通过了为其创建的第一个测试,但是第二个测试证明它并不总是有效的。某些序列可以部分匹配,然后阻止正确的匹配成功。你知道吗
#! /usr/bin/env python3
def main():
"""Source: http://codereview.stackexchange.com/questions/149867"""
print('PASS' if contains((0, 1, 3, 4, 5), (1, 3, 4)) else 'FAIL')
print('PASS' if contains((1, 2, 1, 2, 1, 3), (1, 2, 1, 3)) else 'FAIL')
def contains(iterable, sequence):
"""Determine if sequence can be found in iterable and return the result."""
offset, length = 0, len(sequence)
for item in iterable:
if item == sequence[offset]:
offset += 1
if offset == length:
return True
elif offset:
offset = 0
return False
if __name__ == '__main__':
main()
如何修改contains
函数,使其能够正确地与任何给定的iterable一起工作?你知道吗
没有测试过“所有iterables”,但尝试使用应该有用的习惯用法
编辑了每个评论的新要求:(看起来只是一个更大的范围尝试/除了工作)
是的,我读到pop(0)是低效的
我会完全这样改变我的方法:
我不是每次检查一个项目,而是检查长度
len(sequence)
的母亲列表的一部分是否与sequence
相同。upper_bound
控制所需检查的数量。你知道吗PS:它们都返回
"PASS"
。你知道吗原始(断开的)解决方案的问题是,如果出现部分匹配,然后出现故障,则算法应该回退到iterable数据流中较早的位置。有些语言允许重绕迭代器,但Python不允许重绕,因为迭代器的长度是无限的。通过引入具有历史记录的迭代器包装器,原始代码只需稍加修改。你知道吗
相关问题 更多 >
编程相关推荐