检查列表是否是另一个列表的子列表的程序的断言测试
assertion test for program that checks if a list is a sublist from another list
我写了一个小程序,它应该检查给定列表是否是另一个列表的子列表和 returns 与 True
或 False
:
def is_sublist_of(sublist, given):
""" Returns whether the sublist is part of the given combination.
The order of the sublist must also correspond to the order of the
corresponding part in the given combination."""
return sublist in [given[i:i+len(sublist)] for i in range(0,len(given)-len(sublist))]
此代码是我必须做的作业的一部分,但给定的断言之一是:
simple_list = [1, 2, 3, 4]
for element in simple_list:
assert is_sublist_of([element], simple_list)
assert not is_sublist_of([5], simple_list)
我的程序没有通过这个测试。这是否意味着我的程序在某些特殊情况下不起作用?感谢您对此进行调查。
range
不包括终点,所以你必须加1否则它会错过测试中的最后一个元素
range(0,len(given)-len(sublist)+1)
是。您不生成 all 个子列表:最后一个被省略。如果你给出 given = [1,2,3,4]
和 sublist = [1]
,一个人会得到:
>>> given = [1, 2, 3, 4]
>>> sublist = [1]
>>> [given[i:i+len(sublist)] for i in range(0,len(given)-len(sublist))]
[[1], [2], [3]]
(他们通常称之为“差一个错误”)。
快速解决方法是:
return sublist in [given[i:i+len(sublist)] for i in range(0,len(given)-len(sublist)<b>+1</b>)]
所以 +1
在 range(..)
.
但更优雅的解决方案是:
def is_sublist_of(sublist, given):
n = len(sublist)
return <b>any(</b>sublist == given[i:i+n] for i in range(len(given)-n+1)<b>)</b>
这里算法会在找到这样的列表的那一刻停止,因此不会生成所有个子列表,然后检查其中一个是否匹配。
我写了一个小程序,它应该检查给定列表是否是另一个列表的子列表和 returns 与 True
或 False
:
def is_sublist_of(sublist, given):
""" Returns whether the sublist is part of the given combination.
The order of the sublist must also correspond to the order of the
corresponding part in the given combination."""
return sublist in [given[i:i+len(sublist)] for i in range(0,len(given)-len(sublist))]
此代码是我必须做的作业的一部分,但给定的断言之一是:
simple_list = [1, 2, 3, 4]
for element in simple_list:
assert is_sublist_of([element], simple_list)
assert not is_sublist_of([5], simple_list)
我的程序没有通过这个测试。这是否意味着我的程序在某些特殊情况下不起作用?感谢您对此进行调查。
range
不包括终点,所以你必须加1否则它会错过测试中的最后一个元素
range(0,len(given)-len(sublist)+1)
是。您不生成 all 个子列表:最后一个被省略。如果你给出 given = [1,2,3,4]
和 sublist = [1]
,一个人会得到:
>>> given = [1, 2, 3, 4]
>>> sublist = [1]
>>> [given[i:i+len(sublist)] for i in range(0,len(given)-len(sublist))]
[[1], [2], [3]]
(他们通常称之为“差一个错误”)。
快速解决方法是:
return sublist in [given[i:i+len(sublist)] for i in range(0,len(given)-len(sublist)<b>+1</b>)]
所以 +1
在 range(..)
.
但更优雅的解决方案是:
def is_sublist_of(sublist, given):
n = len(sublist)
return <b>any(</b>sublist == given[i:i+n] for i in range(len(given)-n+1)<b>)</b>
这里算法会在找到这样的列表的那一刻停止,因此不会生成所有个子列表,然后检查其中一个是否匹配。