python 如果为真:在布尔列表中将以下值变为真,直到到达真之后的第n个位置

4xrmg8kj  于 2023-06-04  发布在  Python
关注(0)|答案(3)|浏览(101)

我有一个布尔值列表

l = [False, False, False, True, False, False, False]

我想变成

l_new = [False, False, False, True, True, True, False]

这意味着,每当我的列表中有一个True时,我想将下面的两个值(例如)切换为true。我的解决办法是

def lagged_effect(l, lag):
    l_new = []
    L_iter = iter(l)
    for elem in L_iter:
        if elem == True:
            l_new.extend([True]*lag)
            if lag == 1:
                next(L_iter)
            if lag == 2:
                next(L_iter)
                next(L_iter)
            if lag == 3:
                next(L_iter)
                next(L_iter)
                next(L_iter)
            if lag == 4:
                next(L_iter)
                next(L_iter)
                next(L_iter)
                next(L_iter)
            if lag > 4:
                print("not defined")
        if elem == False:
            l_new.append(False)
    return l_new
    print(l_new)
lagged_effect(l, lag=2)

由于我想更频繁地实现这一点,我想知道是否有一个更紧凑和更有效的解决方案。特别是下一个的实现让我很恼火。

ujv3wf0j

ujv3wf0j1#

使用列表shift和zip与boolean或

l = [False, False, False, True, False, False, False]

out = [x or y or z for x, y, z in zip(l, [False] + l, [False]*2 + l)]
print(out)
[False, False, False, True, True, True, False]

任意lag的选项

lag = 4
l = [False, False, False, True, False, False, False, False, False, True, False, False, False, False, True]
out = [any(z) for z in zip(*[[False] * n + l for n in range(lag + 1)])]
print(out)
[False, False, False, True, True, True, True, True, False, True, True, True, True, True, True]
cbeh67ev

cbeh67ev2#

你可以写一个自定义函数:

l = [False, False, False, True, False, False, False]

def lag_true(l, lag=2):
    out = []
    last = 0
    for v in l:
        if v:                # if True, set up last to lag value
            last = lag
            out.append(True)
        elif last:           # if last (>0, implicit)
            out.append(True) # add True
            last -= 1        # decrease last
        else:                # we have a False and are far from last True
            out.append(False)
    return out

lag_true(l)
# [False, False, False, True, True, True, False]

lag_true(l, lag=3)
# [False, False, False, True, True, True, True]
使用pandas的向量替代
import pandas as pd

LAG = 2

out = pd.Series(l).rolling(LAG+1, min_periods=1).max().astype(bool).to_list()
# [False, False, False, True, True, True, False]
8xiog9wr

8xiog9wr3#

这是一个可能的解决方案:

l_new = l.copy()
for i in range(len(l) - 2):
    if l[i]: l_new[i + 1] = l_new[i + 2] = True

l_new[-1] = True if len(l) > 1 and l[-2] else l_new[-1]

相关问题