我有一个布尔值列表,需要根据一行中有多少个True进行编辑(如果找不到长度,则需要将布尔值更改为False)。我有一些目前很难用的代码(我认为在所有情况下都可以,但是感觉有些数字会破坏它,因为它太烂了),但是我想看看是否有人能以一种简洁,更好的方式处理所有可能性。 / p>
这是一个例子:
num_in_a_row = 3
my_list = [True True False True True True False True]
对于my_list中的值,我需要从头到尾检查一下是否存在至少num_in_a_row个True,否则将其更改为False。因此,my_list的结尾应如下所示:
my_new_list = [False False False True True True False False]
它将更改前两个True,因为连续3个都不为False,与最后一个True相同。但是连续三个True可以生存。如果连续检查的数字为2,则看起来像这样:
num_in_a_row = 2
my_list = [True True False True True True False True]
my_new_list = [True True False True True True False False]
关于如何以一种足够灵活的方式来适应为num_in_a_row变量提供的任何值的简洁方法的想法?
答案 0 :(得分:1)
您可以使用itertools
进行此操作,如下所示:
from itertools import groupby, repeat
run_len = 3
foo = [True, True, False, True, True, True, False, True]
# enumerate runs of the same value in format (value, length)
runs = [(value, len(list(group))) for value, group in groupby(foo)]
print(runs) # [(True, 2), (False, 1), (True, 3), (False, 1), (True, 1)]
# expand that list of runs with your criteria about minimum length
res = sum([list(repeat(value and run >= run_len, run)) for value, run in runs], [])
print(res) # [False, False, False, True, True, True, False, False]