Python 列表仅在等于 n 个前任时才保留值

标签 python

我有一个信号列表(代表连续的测量值):

signals = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0]

我认为只有等于前 n 个测量值的信号才有效。

例如。如果我们只考虑验证 (n=2) 的 2 个测量值,第一次信号从 0 变为 1 我们认为它仍然是 0 但下一个测量值,如果它再次为 1 那么我们认为它仍然是有效并使其为 1。然后我们需要 2 个 0 的测量值将其再次变为 0,等等...这里的信号是 0 和 1 以进行简化,但在我的应用程序中它们可以是其他整数。

期望的输出:

# For n = 2:
valid_s = [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]

# For n = 3:
valid_s = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0]

# For n = 4:
valid_s = [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0]

我一直在寻找一种 pythonesque 的单行方式,但似乎无法找到所需的输出。我尝试了一些方法:

S = signals

# For n = 2
[S[i] if S[i] == S[i-1] else S[i-2] for i, _ in enumerate(S)]
# gives [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]

# For n = 3
[S[i] if S[i] == S[i-1] == S[i-2] else S[i-3] for i, _ in enumerate(S)]
# gives [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]

编辑:我愿意接受 numpy,因为它已经导入了,如果它更容易的话。

最佳答案

我不认为有什么好方法可以使它成为单行/列表理解。虽然您可以使用 all 和列表的一部分来查看该值是否与之前的 n 值相同,但我没有找到确定哪个值的好方法如果不是,应该是最后一个有效值。

相反,您可以使用老式的“多行”for 循环:

signals = [0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0]
n = 3

last_valid = 0
current = None
repeated = 0
res = []
for s in signals:
    if s == current:
        repeated += 1
    else:
        repeated = 1
        current = s
    if repeated >= n:
        last_valid = s
    res.append(last_valid)

之后,res[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0]


或者,更短一点,使用 itertools.groupby ;结果是一样的:

last_valid = 0
res = []
for k, g in itertools.groupby(signals):
    m = len(list(g))
    if m >= n:
        res.extend([last_valid] * (n-1) + [k] * (m-n+1))
        last_valid = k
    else:
        res.extend([last_valid] * m)

关于Python 列表仅在等于 n 个前任时才保留值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47775108/

相关文章:

python - 通过多处理对生成器输出应用 reduce

python - Django 预取与最大值过滤器相关

python - 在加载到 pandas 数据框之前过滤掉 CSV 中的行

python - 将表情符号视为正则表达式中的一个字符

python - 处理异常的设计 - 谷歌应用引擎

python - 我想解析一个大的 csv 文件并将其上传到 mysql 数据库中,但它需要很长时间。 Python/Django

python - 最好的风格、类方法或全局函数是什么?

python - 读取大型 excel 表(猜测大小)

python - Tensorflow/Keras 意思是图像减法

python - tkinter 组合框中是否提供自动完成搜索功能?