如何在Python列表中找到完全匹配的项

3
如何检查 A 中是否存在与 B 完全匹配且连续出现的子序列?在下面的例子中,99, 3, 2 就是 A 中完全匹配且连续出现的子序列。
A =  [0, 3, 123, 0, 99, 3, 2, 1, 2, 33, 1, 76]

B =  [99, 3, 2]

一个会失败的A的例子是:
A = [0, 321, 99, 0, 3, 0, 2, 0]

作为99、3、2元素不连续出现。
我已经尝试了以下内容:
if B in A:
   print("yes")
else:
   print("NO")

这个失败了。

谢谢大家, Jemma

2个回答

3
def consecutive_in(B,A):
    return B in (A[i:i+len(B)] for i in range(len(A)))

谢谢 fab - 你能否耐心地跟我解释一下: return B in (A[i:i+len(B)] for i in range(len(A))) 特别是对于 i:i+len(B)我理解 len 表示长度,但其他的在我的脑海中混乱不清。 - NoobyD
@NoobyD 试着运行 "print([A[i:i+len(B)] for i in range(len(A))])"。 - exprosic
A[i:i+len(B)] 表示从 A[i] 开始的子列表,其长度为 len(B)。 - exprosic

1
你可以使用带有生成表达式的any,将长度为b的所有切片与b进行比较。
>>> a = [0, 3, 123, 0, 99, 3, 2, 1, 2, 33, 1, 76]
>>> b = [99, 3, 2]
>>> any(b == a[i:i+len(b)] for i in range(len(a) - len(b) + 1))
True
>>> a = [0, 321, 99, 0, 3, 0, 2, 0]
>>> any(b == a[i:i+len(b)] for i in range(len(a) - len(b) + 1))
False

range(len(a) - len(b) + 1) 返回所有与 b 长度相同的子序列的可能起始位置。 b == a[i:i+len(b)] 创建一个从索引 i 开始且长度为 b 的列表,并将其与 b 进行比较,得到布尔值。如果生成的布尔值中有任何一个为 True,则 any 将返回 True,否则如果所有值都是 False,则返回 False


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接