gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:41:38 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com