我有一个值列表
[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,但这也没有考虑到开始和结束情况(例如,我将得到第一组 3)正确,正确,错误)
而且我觉得列表的开头和结尾有一些困难。
最佳答案
使用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
是重复值,对于 0
,bool(v)
为 False
:
>>> 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]
关于python - 接收一个列表,根据连续的重复值返回 True/False 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50801616/