目录
这个高效一点:
def find_consecutive_ones(lst, n=4):
indices = []
count = 0
# 遍历列表
for i in range(len(lst)):
if lst[i] == 1:
count += 1
else:
count = 0 # 一旦遇到0,重置计数
# 当找到连续n个1时,记录起始index
if count == n:
indices.append(i - n + 1) # 起始index为当前index - n + 1
# 为了找到多个连续序列,将count重置为n-1,以便继续寻找
count = n - 1
return indices
# 示例列表,长度20的0和1列表
lst = [0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1]
indices = find_consecutive_ones(lst)
print(indices)
效率低一点
def find_consecutive_ones(lst, n=4):
# 初始化滑动窗口中1的数量
count = sum(lst[:n])
indices = []
# 遍历列表,检查每一个滑动窗口是否有n个连续的1
for i in range(len(lst) - n):
if count == n: # 如果当前窗口内的1数量等于n,记录起始index
indices.append(i)
# 滑动窗口,更新count
count += lst[i + n] - lst[i]
# 检查最后一个窗口
if count == n:
indices.append(len(lst) - n)
return indices
# 示例列表,长度20的0和1列表
lst = [0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1]
indices = find_consecutive_ones(lst)
print(indices)
字典方式:
def find_consecutive_ones_dict(lst, n=4):
# 初始化滑动窗口中 'valid' 键为 1 的数量
count = sum(1 for i in range(n) if lst[i].get('valid') == 1)
indices = []
# 遍历列表,检查每一个滑动窗口是否有 n 个连续 'valid' 为 1
for i in range(len(lst) - n):
if count == n: # 如果当前窗口内 'valid' 为 1 的数量等于 n,记录起始index
indices.append(i)
# 滑动窗口,更新 'valid' 为 1 的数量
count += (lst[i + n].get('valid') == 1) - (lst[i].get('valid') == 1)
# 检查最后一个窗口
if count == n:
indices.append(len(lst) - n)
return indices
# 示例列表,包含字典,每个字典的 'valid' 键为 0 或 1
lst = [
{'valid': 0}, {'valid': 1}, {'valid': 1}, {'valid': 1},
{'valid': 1}, {'valid': 0}, {'valid': 1}, {'valid': 1},
{'valid': 1}, {'valid': 1}, {'valid': 0}, {'valid': 1},
{'valid': 1}, {'valid': 1}, {'valid': 1}, {'valid': 1},
{'valid': 0}, {'valid': 1}, {'valid': 1}, {'valid': 1}
]
indices = find_consecutive_ones_dict(lst)
print(indices)