我有一个值列表
[3, 3, 3, 0, 0, 2, 2, 2, 2, 1, 5, 5, 5]
我希望根据是否有连续重复返回True / False值列表。我还想设置一个阈值,这样如果至少有3个连续的值,我才会开始获得True。
例如,上面列表的输出将是......
[True, True, True, False, False, True, True, True, True, False, True, True, True]
我真的不知道这样做最简单有力的方法。我做了一个for循环来检查当前值是否等于下一个值,并将其设置为true,但这也没有考虑到开始和结束的情况(例如,第一组3s I中的一个)会得到真,真,假)
此外,我觉得列表的开头和结尾有些困难。
答案 0 :(得分:2)
使用itertools.groupby()
对连续值进行分组,然后根据每个组的长度将这些组转换为重复的True
或False
值:
from itertools import groupby
def consecutives(it, length):
for v, group in groupby(it):
grouplength = sum(1 for _ in group)
yield from (grouplength >= length,) * grouplength
groupby()
使用可调用来确定要作为第二个参数分组的内容,但如果没有可调用,则默认为对相等进行分组。
演示:
>>> list(consecutives([3, 3, 3, 0, 0, 2, 2, 2, 2, 1, 5, 5, 5], 3))
[True, True, True, False, False, True, True, True, True, False, True, True, True]
如果要为零返回False
,即使是连续的,也请使用:
def consecutives(it, length):
for v, group in groupby(it):
grouplength = sum(1 for _ in group)
yield from (bool(v) and grouplength >= length,) * grouplength
v
是重复的值,bool(v)
False
为0
:
>>> list(consecutives([3, 3, 3, 0, 0, 0, 0, 2, 2, 2, 2, 1, 5, 5, 5], 3))
[True, True, True, False, False, False, False, True, True, True, True, False, True, True, True]