查看列表是否存在于另一个列表中?

时间:2010-02-21 11:39:33

标签: python list

基本上可以说我有:

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

我想看看b中的所有元素是否存在于a和相同的顺序中。因此,对于上面的例子,b将存在于。

我有点希望这是一个非常简单的单行答案。

6 个答案:

答案 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-PrattBoyer 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