2013-11-14 73 views
1

問題是:您要編寫一個函數isSublist(),它帶有兩個參數(list, sublist),並返回1,如果子列表是列表的子列表,則返回0;否則返回0。檢查列表中的子列表

所以我有我的代碼,但我得到True當子列表不在列表中。有關修復此問題的任何建議嗎?

def isSublist(list, sublist): 
    for i in range(len(list)-(len(sublist))+1): 
     return True 
    if sublist==list[i:i+(len(sublist))]: 
     return False 

樣本輸入:

def n_slices(n, list_): 
    for i in xrange(len(list_) + 1 - n): 
     yield list_[i:i+n] 

def isSublist(list_, sub_list): 
    for slice_ in n_slices(len(sub_list), list_): 
     if slice_ == sub_list: 
      return True 
    return False 

爲了掩蓋排序問題:

list= (0,1,2,3,4,5,6,7,8,9) 
isSublist(list, [1,2,3]) 
output: 
True 
+0

您能提供樣品輸入和預期輸出嗎?當你說子列表時,你的意思是在[[1,2,3],[5,6,7]]中的[1,2,3],還是你的意思是[1,2,3]在[1,2,3,4,5,6]'? –

+0

請簡要定義列表的子列表是什麼意思 – pkacprzak

+0

並且沒有訂單計數?你是否想要兩個子列表'[1,2,3]'和'[2,3,1]'的相同輸出? –

回答

6

您可以通過獲取所有片的子表的大小,以及比較平等打破這種向上。根據定義,列表是有序的。如果我們想忽略排序,你可以做套:

def isSubset(list_, sub_list): 
    return set(sub_list) <= set(list_) 

如果我們需要覆蓋重複的元素,而忽略排序,你現在在多集的境界:

def isSubset(list_, sub_list): 
    for item in sub_list: 
     if sub_list.count(item) > list_.count(item): 
      return False 
    return True 
+0

一樣出現在列表中這是目前爲止唯一的答案。 – FogleBird

+2

集合有'<='運算符,不需要使用聯合。 'return set(sub_list)<= set(list_)' – FogleBird

0
>>> def isSublist(originallist,sublist,biglist): 
    if not sublist: 
     return True 
    if not biglist: 
     return False 
    if sublist[0]==biglist[0]: 
     return isSublist(originallist,sublist[1:],biglist[1:]) or isSublist(originallist,sublist,biglist[1:]) 
    return isSublist(originallist,originallist,biglist[1:]) 

測試輸出:

>>> isSublist([1,2,4],[1,2,4],[1,2,3,4]) 
False 
>>> isSublist([1,2,3],[1,2,3],[1,2,3,4]) 
True 
>>> 

編輯子列表,而不是子集。醜陋,但工作。可以添加一個包裝以避免混淆參數。你的問題的

def sublist(a,b): 
    isSublist(a,a,b) 
+1

'isSublist([1,2,4],[1,2,3,4])'返回'True',不正確。 – FogleBird

+0

如果訂單是重要的,OP沒有說明,所以你可能不太確定。 –

+0

子列表,不是子集。子集將是一個簡單的'返回集(子列表)<=設置(列表)' – FogleBird

0

部分原因是,在Python (0,1,2,3,4,5,6,7,8,9)在技術上不是list,這是一個tuple - 這基本上是一個不可改變(不可更改)list。此外,應避免將程序中的內容命名爲內置函數和類型,因爲偶爾需要引用它們,而您自己的定義會隱藏系統提供的內容。

解決這個問題的一個簡單方法是在名稱的末尾添加一個_,如下所示,它嘗試將參數轉換爲list(如果它最初不是一個)。它不測試sublist參數的類型,但類似的檢查也可能適用於它。

def isSublist(list_, sublist): 
    if not isinstance(list_, list): 
     list_ = list(list_) 
    sublen = len(sublist) 
    for i in xrange(len(list_)-sublen+1): 
     if list_[i:i+sublen] == sublist: 
      return True 
    return False 

list_ = (0,1,2,3,4,5,6,7,8,9) 
print subfunc(list_, [0,1]) # --> True 
print subfunc(list_, [1,2,3]) # --> True 
print subfunc(list_, [4,6,7]) # --> False 
print subfunc(list_, [4,5]) # --> True 
0
def isSublist(x, y): 
    occ = [i for i, a in enumerate(x) if a == y[0]] 
    for b in occ: 
     if x[b:b+len(y)] == y: 
      print 'YES-- SUBLIST at : ', b 
      return True 
     else: 
      pass 
     if len(occ)-1 == occ.index(b): 
      print 'NO SUBLIST' 
      return False 

list1 = [1,0,1,1,1,0,0] 
list2 = [1,0,1,0,1,0,1] 

#should return True 
isSublist(list1, [1,1,1]) 

#Should return False 
isSublist(list2, [1,1,1]) 
0

我剛寫此配方(這適用於連續的子表):

def is_sublist(sublist, superlist): 
    ''''' 
    Checks whether 'sublist' is a sublist of 'superlist'. 
    Both arguments must be typed list or tuple. 
    ''' 
    if not isinstance(sublist, (list, tuple)) or not isinstance(sublist, (list,tuple)): 
     raise TypeError("Both 'sublist' and 'superlist' must be lists or tuples.") 
    # Return early if candidate sublist is longer than superlist 
    if len(sublist) > len(superlist): 
     return False 
    else: 
     for chunk in (superlist[i:i+len(sublist)] for i in range(0, len(superlist)-len(sublist)+1)): 
      if chunk == sublist: 
       return True 
     return False 

的想法是有一個移窗口(具有相同的寬度爲候補子列表)掃描超級列表並在每次迭代時檢查塊和子列表之間的等同性。

這是一種蠻力方法。

+0

對不起,我沒有看到原始發佈日期和所有現有答案。我會留下我的答案,因爲它的語法和類型檢查與其他答案有點不同。 –