检查一个数组的所有元素是否在另一个数组中

时间:2013-12-26 18:29:15

标签: python list

我有这两个数组:

A = [1,2,3,4,5,6,7,8,9,0] 

B = [4,5,6,7]

有没有办法检查B是否是A中的子列表,具有相同的项目顺序?

5 个答案:

答案 0 :(得分:18)

issubset应该帮助你

set(B).issubset(set(A))

e.g:

>>> A= [1,2,3,4]
>>> B= [2,3]
>>> set(B).issubset(set(A))
True

编辑:错误,此解决方案并不意味着元素的顺序!

答案 1 :(得分:6)

这个怎么样:

A = [1,2,3,4,5,6,7,8,9,0] 

B = [4,5,6,7]
C = [7,8,9,0]
D = [4,6,7,5]

def is_slice_in_list(s,l):
    len_s = len(s) #so we don't recompute length of s on every iteration
    return any(s == l[i:len_s+i] for i in xrange(len(l) - len_s+1))

结果:

>>> is_slice_in_list(B,A)
True
>>> is_slice_in_list(C,A)
True
>>> is_slice_in_list(D,A)
False

答案 2 :(得分:3)

使用切片:

for i in range(len(A) - len(B)):
    if A[i:i+len(B)] == B:
        return True
return False

如果你的A大于B,那么这样的东西就会起作用。

答案 3 :(得分:2)

我更喜欢使用index来确定起点。通过这个小例子,它比迭代解决方案更快:

def foo(A,B):
    n=-1
    while True:
        try:
            n = A.index(B[0],n+1)
        except ValueError:
            return False
        if A[n:n+len(B)]==B:
            return True

无论B(长,短,现在与否),与此相关的时间都相当稳定。迭代解决方案的时间因B开始的地方而异。

为了使这个更强大,我已经过测试

A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1]

更长,并重复值。

答案 4 :(得分:-3)

A = [1,2,3,4,5,6,7,8,9,0]
B = [4,5,6,7]

(A and B) == B

True