2017-03-04 27 views
3

我写了一个小程序,应该检查是否给定列表中的子表是从另一个列表中的子列表,并返回TrueFalse方案断言测试来检查,如果一个列表是从另一个列表中

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) 

而我的计划未能做到这一点。这是否意味着我的程序在某些特殊情况下不起作用?感谢您关注此事。

回答

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)]
与在range(..)+1

左右。

但一个更优雅的解决办法是:

def is_sublist_of(sublist, given): 
    n = len(sublist) 
    return any(sublist == given[i:i+n] for i in range(len(given)-n+1))

这里的算法会从中发现了这样的名单,因此不会产生所有子列表,然后检查是否有一个值匹配的那一刻停止。

3

range不包括端点,所以你必须要加1或它忽略了最后一个元素测试

range(0,len(given)-len(sublist)+1) 
相关问题