我有这两个数组:
A = [1,2,3,4,5,6,7,8,9,0]
和
B = [4,5,6,7]
有没有办法检查B是否是A中的子列表,具有相同的项目顺序?
答案 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