2017-03-04 25 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) 
相關問題