基本上可以说我有:查看另一个列表中是否存在列表?
>>> 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