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

标签 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,但这也没有考虑到开始和结束情况(例如,我将得到第一组 3)正确,正确,错误)

而且我觉得列表的开头和结尾有一些困难。

最佳答案

使用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 是重复值,对于 0bool(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/

相关文章:

python - 将辅助 y 轴刻度与主 x 轴上的带状图对齐

python - 如何在 Python 中初始化类(而不是实例)?

python - Spacy 极性/情感方法不起作用

python - 设置Python文件中值的允许数据类型/类型转换的范围

python - Cython:cimport 和 import numpy as (both) np

python - 检查场景文件中是否存在文件,如果存在则调用错误,否则强制打开文件

python - Flask 邮件错误 "SMTPServerDisconnected(' 请先运行 connect()')"

python - 匹配字符串中的多个模式

python - pickle 错误: AttributeError: Can't get attribute on <module '__main__' (built-in)>

python - PyMongo 连接被拒绝