2010-02-21 114 views
3

基本上可以說我有:查看另一個列表中是否存在列表?

>>> a = [1,3,2,2,2] 
>>> b = [1,3,2] 

我想看看是否所有B中的元素中的存在,並以相同的順序。所以對於上面的例子b會存在於a中。

我有點希望這是一個非常簡單的一行答案。

+2

到目前爲止您嘗試過什麼?這聽起來像是作業,所以最好展示你做了什麼。 – 2010-02-21 11:46:12

+4

你的意思是:「我想看看b中的所有元素是否連續存在**。 「以相同的順序」是一個較弱的陳述。 – 2010-02-21 12:02:56

+0

對不起,我嘗試了簡單地通過a,檢查第一個元素是否正確,然後繼續,如果下一個等於第二個繼續,否則重新開始。寫這個大循環看起來很單調乏味。不過,我將會使用這個很多。這是針對與某個訂購系統/交付所使用的運行長度編碼相關的工作項目。基本上,我們真正可以互動和定製功能的唯一方式是直接與工作訂單協作,這是一個可怕的80年代代碼。 – UberJumper 2010-02-21 13:14:46

回答

6

這是一個簡單的O(N * M)算法:

any(a[i:i + len(b)] == b for i in range(len(a) - len(b) + 1)) 

請注意,是不是這樣做的最快方法。如果你需要高性能,你可以使用類似於string searching algorithms中使用的技術。

+0

這很優雅! – 2010-02-21 13:13:15

+0

完美,這正是我所期待的。 – UberJumper 2010-02-21 13:15:07

0

這可能不是非常有效的,但你可以使用:因爲2的重複的

In [1]: a = [1,3,2,2,2] 

In [2]: b = [1,3,2] 

In [3]: b == [val for val in a if val in b] 
Out[3]: False 

In [4]: a = [6,1,3,2,5,4] 

In [5]: b == [val for val in a if val in b] 
Out[5]: True 

第一個測試返回False。問題是你想如何處理一般的重複。如果你只是想將其剪掉末,那麼你可以在列表修整爲a長度:

In [6]: a = [1,3,2,2,2] 

In [7]: b == [val for val in a if val in b][:len(b)] 
Out[7]: True 
-2

如果「以相同的順序」,

>>> a = [1,3,2,2,2] 
>>> b = [1,3,2] 
>>> ' '.join(map(str,b)) in ' '.join(map(str,a)) 
True 

>>> a = [1,1,2,2,2,13,2] 
>>> b = [1,3,2] 
>>> ' '.join(map(str,b)) in ' '.join(map(str,a)) 
False 
+0

這也會爲'b = [13,2]'返回'True'。 (沒有要求列表中的元素的字符串表示都是一個字符長)。 – 2010-02-21 12:58:13

+0

然後我們加入一個空格而不是null。應該修復它。 – ghostdog74 2010-02-21 15:13:26

+0

對不起,這不能解決它。現在這將返回'真',用於'a = ['1','2']和'b = ['1 2']'。 (在這個問題中,元素也不是數字)。 – 2010-02-21 17:03:57

1

這裏有一個解決方案,適用於整數列表。

將例如[1,3,2]轉換爲字符串「'1','3','2'」。然後使用內置的字符串包含來查看它是否在另一個列表中。

repr(map(str, b))[1:-1] in repr(map(str, a))[1:-1] 
2

如果「以相同的順序」你的意思是子(而不是字符串),那麼這非一個班輪應該工作速度快:

def is_subsequence(x, y): 
    i, j = 0, 0 
    while i < len(x) and j < len(y): 
     if x[i] == y[j]: 
     i += 1 
     j += 1 
    return i == len(x) 
+0

如果你打算讓自己的代碼自我評論,你應該把'x'和'y'重命名爲更具描述性的名稱;否則,記錄你的代碼並解釋哪個是哪個。它是'is_subsequence(「abcecde」,「cde」)或'is_subsequence(「cde」,「abcecde」)'? – tzot 2010-02-22 22:27:29

0

很抱歉,但你想要做什麼實際上與字符串匹配相同(儘管使用列表而不是字符串)。對於線性時間算法,您可能想要查看Knuth-Morris-PrattBoyer Moore

編輯:
我假設,通過「以」你的意思是順序依次任何地方。如果他們可以被其他元素隔開,那麼這不是你想要的解決方案。

相關問題