Python 在布尔值重复n次的点拆分列表

Python 在布尔值重复n次的点拆分列表,python,list,time-series,nan,Python,List,Time Series,Nan,我有两个列表,其中包含时间序列的时间和值。有一个包含布尔值的对应列表,该布尔值标识NAN值在时间序列中的位置。我需要做的是,如果真值(即NAN值)重复5次以上(一行中有6个NAN值),则将列表拆分为两个(在序列的开始和结束处,因此在两个结果列表中没有NAN值。因此,基本上,我需要将列表拆分为一个较小列表的列表,该列表的开始和结束处有一个包含6个以上重复NAN值的间隔。我尝试了以下方法: for i in range(len(nan_list)-5): if nan_lis

我有两个列表,其中包含时间序列的时间和值。有一个包含布尔值的对应列表,该布尔值标识NAN值在时间序列中的位置。我需要做的是,如果真值(即NAN值)重复5次以上(一行中有6个NAN值),则将列表拆分为两个(在序列的开始和结束处,因此在两个结果列表中没有NAN值。因此,基本上,我需要将列表拆分为一个较小列表的列表,该列表的开始和结束处有一个包含6个以上重复NAN值的间隔。我尝试了以下方法:

    for i in range(len(nan_list)-5):
        if nan_list[i] == True and nan_list[i+1] == True and nan_list[i+2] == True and nan_list[i+3] == True and nan_list[i+4] == True and nan_list[i+5] == True:
我真的不确定从现在开始最好的方法是什么,我确定还有更好的方法


然后,我需要做的是,对于重复次数少于5次的重复NAN值(一行6个NAN值),将这些值替换为使用scipy中的b样条曲线计算的值。我不太确定如何执行此操作。谢谢!

如果我正确理解您的意思,您希望基于另一个列表的索引拆分一个列表(假设列表具有相同的长度)以这样一种方式,
n
在另一个列表中重复的元素定义了一个片段应该出现的位置。一种“优雅”但不是最有效的方式是只遍历另一个列表中
n
大小的片段,并检查
是否全部(nan_list[i:i+n])
在当前索引处-如果是,将索引前的第一个列表中的所有内容作为一个片段放入结果中,然后跳过
n
放置并重复该过程。不过,我更喜欢一种程序方法:

def split_list(source, nan_data, nan_len=6):
    result = []  # a list for our final result
    last_pos = 0  # holds the last sliced position
    counter = 0  # a counter for sequential NaNs
    for i, is_nan in enumerate(nan_data):
        if not is_nan:  # encountered a non-NaN, check how many consecutive NaNs we had
            if counter >= nan_len:  # we have a match...
                result.append(source[last_pos:i-counter])  # add a new slice to our result
                last_pos = i  # set the new slice position
            counter = 0  # reset the counter
        else:
            counter += 1  # NaN found, increase the counter
    # find the last slice, if any
    left_over = source[last_pos:] if counter < nan_len else source[last_pos:-counter]
    if left_over:
        result.append(left_over)
    return result  # return the result

你不认为粘贴代码比描述代码好吗?请格式化你的问题:使用段落,使用示例,…你想读这样的问题吗?对不起,这更清楚一点吗?
base_list = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10",
             "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"]
nan_list = [True, False, True, False, True, True, True, True, True, True,
            False, True, False, True, True, False, True, True, True, False]

print(split_list(base_list, nan_list, 3))
# [['01', '02', '03', '04'], ['11', '12', '13', '14', '15', '16'], ['20']]