基本上可以说我有:
>>> a = [1,3,2,2,2]
>>> b = [1,3,2]
我想看看b中的所有元素是否存在于a和相同的顺序中。因此,对于上面的例子,b将存在于。
中我有点希望这是一个非常简单的单行答案。
答案 0 :(得分:6)
这是一个简单的O(n * m)算法:
any(a[i:i + len(b)] == b for i in range(len(a) - len(b) + 1))
请注意,这不是最快的方法。如果您需要高性能,则可以使用与string searching algorithms中使用的技术类似的技术。
答案 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)
答案 2 :(得分:1)
这是一个适用于整数列表的解决方案。
将例如[1,3,2]转换为字符串“'1','3','2'”。然后使用内置字符串包含来查看它是否在另一个列表中。
repr(map(str, b))[1:-1] in repr(map(str, a))[1:-1]
答案 3 :(得分:0)
这可能效率不高,但您可以使用:
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
由于2
的重复,第一个测试返回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
答案 4 :(得分:0)
很抱歉,但您想要做的事情实际上与字符串匹配相同(尽管使用列表而不是字符串)。您可能需要查看Knuth-Morris-Pratt或Boyer Moore的线性时间算法。
修改:
我假设“按顺序”你的意思是连续地在序列中的任何地方。如果它们之间可以被其他元素分开,那么这不是你想要的解决方案。
答案 5 :(得分:-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