我编写了一个小程序,应检查给定列表是否是其他列表中的子列表,并返回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)
我的程序未通过此测试。这是否意味着我的程序在某些特殊情况下不起作用?感谢您对此进行调查。
答案 0 :(得分:5)
是即可。您不会生成所有子列表:省略最后一个。如果您提供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)+1)]
+1
中的range(..)
。
但更优雅的解决方案是:
def is_sublist_of(sublist, given):
n = len(sublist)
return any(sublist == given[i:i+n] for i in range(len(given)-n+1))
此处算法将从找到此类列表的那一刻起停止,因此不会生成所有子列表,然后检查其中一个是否匹配。
答案 1 :(得分:3)
range
不包含终点,因此您必须添加1或者它错过了测试中的最后一个元素
range(0,len(given)-len(sublist)+1)