基本上可以說我有:查看另一個列表中是否存在列表?
>>> a = [1,3,2,2,2]
>>> b = [1,3,2]
我想看看是否所有B中的元素中的存在,並以相同的順序。所以對於上面的例子b會存在於a中。
我有點希望這是一個非常簡單的一行答案。
基本上可以說我有:查看另一個列表中是否存在列表?
>>> a = [1,3,2,2,2]
>>> b = [1,3,2]
我想看看是否所有B中的元素中的存在,並以相同的順序。所以對於上面的例子b會存在於a中。
我有點希望這是一個非常簡單的一行答案。
這是一個簡單的O(N * M)算法:
any(a[i:i + len(b)] == b for i in range(len(a) - len(b) + 1))
請注意,是不是這樣做的最快方法。如果你需要高性能,你可以使用類似於string searching algorithms中使用的技術。
這很優雅! – 2010-02-21 13:13:15
完美,這正是我所期待的。 – UberJumper 2010-02-21 13:15:07
這可能不是非常有效的,但你可以使用:因爲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
如果「以相同的順序」,
>>> 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
這也會爲'b = [13,2]'返回'True'。 (沒有要求列表中的元素的字符串表示都是一個字符長)。 – 2010-02-21 12:58:13
然後我們加入一個空格而不是null。應該修復它。 – ghostdog74 2010-02-21 15:13:26
對不起,這不能解決它。現在這將返回'真',用於'a = ['1','2']和'b = ['1 2']'。 (在這個問題中,元素也不是數字)。 – 2010-02-21 17:03:57
這裏有一個解決方案,適用於整數列表。
將例如[1,3,2]轉換爲字符串「'1','3','2'」。然後使用內置的字符串包含來查看它是否在另一個列表中。
repr(map(str, b))[1:-1] in repr(map(str, a))[1:-1]
如果「以相同的順序」你的意思是子(而不是字符串),那麼這非一個班輪應該工作速度快:
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)
如果你打算讓自己的代碼自我評論,你應該把'x'和'y'重命名爲更具描述性的名稱;否則,記錄你的代碼並解釋哪個是哪個。它是'is_subsequence(「abcecde」,「cde」)或'is_subsequence(「cde」,「abcecde」)'? – tzot 2010-02-22 22:27:29
很抱歉,但你想要做什麼實際上與字符串匹配相同(儘管使用列表而不是字符串)。對於線性時間算法,您可能想要查看Knuth-Morris-Pratt或Boyer Moore。
編輯:
我假設,通過「以」你的意思是順序依次任何地方。如果他們可以被其他元素隔開,那麼這不是你想要的解決方案。
到目前爲止您嘗試過什麼?這聽起來像是作業,所以最好展示你做了什麼。 – 2010-02-21 11:46:12
你的意思是:「我想看看b中的所有元素是否連續存在**。 「以相同的順序」是一個較弱的陳述。 – 2010-02-21 12:02:56
對不起,我嘗試了簡單地通過a,檢查第一個元素是否正確,然後繼續,如果下一個等於第二個繼續,否則重新開始。寫這個大循環看起來很單調乏味。不過,我將會使用這個很多。這是針對與某個訂購系統/交付所使用的運行長度編碼相關的工作項目。基本上,我們真正可以互動和定製功能的唯一方式是直接與工作訂單協作,這是一個可怕的80年代代碼。 – UberJumper 2010-02-21 13:14:46