2010-02-21 147 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

编辑:
我假设,通过“以”你的意思是顺序依次任何地方。如果他们可以被其他元素隔开,那么这不是你想要的解决方案。

相关问题