接受一个列表,根据连续的重复值返回True / False列表

时间:2018-06-11 15:48:46

标签: python

我有一个值列表

[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中的一个)会得到真,真,假)

此外,我觉得列表的开头和结尾有些困难。

1 个答案:

答案 0 :(得分:2)

使用itertools.groupby()对连续值进行分组,然后根据每个组的长度将这些组转换为重复的TrueFalse值:

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) False0

>>> 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]