2011-02-28 102 views
1

我必須檢查list1是否包含在list2中。它也應該檢查它是否按順序出現在列表中。如果它是真的,它應該返回true和false,如果不是。python list and sublist

def check(lst1, lst2): 
for x in lst1: 
    for y in lst2: 
     xx = lst1.sort() 
     yy = lst2 
     if xx != yy: 
      return False 
     else: 
      return True 

我很困惑自己與for循環,而且,我不知道從哪裏去解決我的代碼。請指點?

它應該做的

例如:

check([4,0],[9,1,4,6,8,9]) 
    True 
    check([1,2],[2,3,1]) 
    False 
+2

在你的例子中,爲什麼第一個檢查返回True?零不在第二個列表中。 – yan 2011-02-28 22:44:07

+0

如果必須包含list1,按順序在list2中,排序()時不會丟失排序嗎? – payne 2011-02-28 22:45:46

+0

如果你沒有在循環體中使用'x'和'y'項,你爲什麼要循環遍歷這兩個列表呢? – Wang 2011-02-28 23:01:05

回答

3

我認爲這個問題是乞討被遞歸地解決,所以我所做的:

def check(needle, haystack): 
    if not needle: 
     return True 
    try: 
    offset = haystack.index(needle[0]) 
    return check(needle[1:], haystack[offset+1:]) 
    except: 
    return False 

編輯:

簡要說明:

首先我們檢查一下我們要找的清單是否是空的(這一點很重要rt調用自己),因爲所有列表中都有空列表,所以我們返回True。然後,我們嘗試在我們正在查看的列表中找到我們要查找的列表中的第一項。如果我們找到它,我們再次調用函數,但稍微改變一下參數:我們已經看過「針」的第一項,並在「乾草堆」中看到它。所以現在我們需要檢查「針」的剩餘部分是否在「乾草堆」的剩餘部分。所以我們只用兩個列表的其餘部分再次調用函數。針的其餘部分是除了第一個元素之外的所有東西,乾草堆的其餘部分都是我們找到的東西之後的所有項目。如果我們達到第一個列表爲空的地步,這意味着我們在乾草堆中找到了它。如果我們得到一個異常,我們沒有找到我們正在尋找的東西,所以我們返回False,它會調用堆棧並返回。

+0

'index'返回所尋找物品的索引,而Python使用半開區間,所以haystack [offset:]不會從haystack中移除所需物品。 – Wang 2011-02-28 22:58:10

+0

謝謝,我解決了它。 – yan 2011-02-28 22:59:49

+0

謝謝,超級容易理解! – 97834657647563 2011-02-28 23:01:14

0
>>> a=[9,1,4,6,8,9] 
>>> by_twos=zip(a, a[1:]) 
>>> by_twos 
[(9, 1), (1, 4), (4, 6), (6, 8), (8, 9)] 
>>> (4,6) in by_twos 
True 
+0

我相信OP的問題可以包括正在搜索的列表中的元素在搜索列表中不連續的情況。此外,不確定是否指定了兩個長度。 – yan 2011-02-28 22:55:56

+0

@yan當然,我想我會展示如何解決一個案例,而OP可以概括它,但他們喜歡。 – 2011-02-28 22:58:39

+0

@the OP:你可以使用兩個以上的列表調用zip,所以爲了得到by_threes,你可以使用'zip(a,a [1:],a [2:])......' – 2011-02-28 23:00:11

1

你可能喜歡的東西開始:

set(lst1).issubset(lst2) 

,看是否LST1包含LST2無視秩序之內。如果通過一個列表包含其他內的測試,那麼你可以這樣做:

ii = lst2.index(lst1[0]) 
if lst2[ii:ii+len(lst1)] == lst1: 
    return True 
else: 
    return False 

本來我說,第一次檢查是無關緊要給出的第二個,但你必須妥善處理如果lst1的第一個元素不在lst2中,則爲ValueError

編輯: 正如一個側面說明,我比一個版本的我的代碼VS嚴的和我顯著更快幾乎在所有的情況,特別是如果LEN(LST1)較大(可達200​​X加速VS炎的實現)。試一試timeit模塊。

def check(lst1,lst2): 
    try: 
     ii = lst2.index(lst1[0]) 
    except ValueError: 
     return False 

    if lst2[ii:ii+len(lst1)] == lst1: 
     return True 
    else: 
     return False 

至於它是如何工作ii = lst2.index(lst1[0])解釋發現於lst2是的lst1第一元素相匹配的索引。如果該物品從lst2中缺失,則會捕獲ValueError並返回False。如果該元素確實存在,lst2[ii:ii+len(lst1)] == lst1比較所有lst1lst2的子列表,從匹配元素開始並取下一個len(lst)元素。

+0

無論如何,沒有明確的循環。 – 2011-02-28 23:01:18

+0

你的解決方案引起了我的興趣,特別是這一行:if lst2 [ii:ii + len(lst1)] == lst1 :.你介意給我解釋一下嗎? – 97834657647563 2011-03-01 02:53:50

+0

增加了實際的實現和解釋 – JoshAdel 2011-03-01 03:10:08