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