连续检查X个相同元素的列表

时间:2019-06-20 23:12:28

标签: python python-2.7

我有一个布尔值列表,需要根据一行中有多少个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变量提供的任何值的简洁方法的想法?

1 个答案:

答案 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]

看到它在这里运行:https://repl.it/repls/StarryDecisiveCharacters