myList = [True, True, False, False, True, False, True, False, False]
Run Code Online (Sandbox Code Playgroud)
我想找到True是否连续出现3次.
我可以通过这样做找到它:
for x0, x1, x2 in zip(myList, myList[1:], myList[2:]):
if x0 == True and x1 == True and x2 == True:
print True
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
用于itertools.groupby()对元素进行分组,然后计算每个组.如果找到匹配项,使用该any()函数可以提前退出循环:
from itertools import groupby, islice
print any(sum(1 for _ in islice(g, 3)) == 3 for k, g in groupby(myList) if k)
Run Code Online (Sandbox Code Playgroud)
该if k滤波器组只算的组True值.
该itertools.islice()函数确保我们只查看组的前3个元素,并忽略该组的其余部分.这样你就可以避免计算下一个很多的True值,只是为了确定你找到了至少3个.
演示:
>>> from itertools import groupby, islice
>>> myList = [True, True, False, False, True, False, True, False, False]
>>> [sum(1 for _ in islice(g, 3)) for k, g in groupby(myList) if k]
[2, 1, 1]
>>> any(sum(1 for _ in islice(g, 3)) == 3 for k, g in groupby(myList) if k)
False
>>> myList = [True, True, False, False, True, True, True, True, False, True, False, False]
>>> [sum(1 for _ in islice(g, 3)) for k, g in groupby(myList) if k]
[2, 3, 1]
>>> any(sum(1 for _ in islice(g, 3)) == 3 for k, g in groupby(myList) if k)
True
Run Code Online (Sandbox Code Playgroud)
我使用列表推导来显示组大小(仅计数True组)以显示any()调用False首先返回的原因,然后True; 第二个例子有一组4个连续的True值.