我经常遇到以下问题的类比,并且在编写干净的代码以解决它时遇到了麻烦。通常,我有一些涉及临时变量和for循环的东西,但有更优雅的方式吗?
假设我有一个布尔值或值的列表,评估为布尔值:
[True, False, True, False, False, True]
我如何将其映射到值列表,其索引为前一个True,包括?
[0, 0, 2, 2, 2, 5]
[编辑]尝试了以下方面的内容:
def example(lst):
rst, tmp = [], None
for i in range(len(lst)):
if lst[i]:
tmp = i
rst.append(tmp)
return rst
假设列表的第一个元素始终为True。
答案 0 :(得分:3)
虽然它仍然使用for循环和临时变量,但我认为它仍然相对干净。如果需要,可以替换yield
并附加到列表并返回。
def get_indexes(booleans):
previous = 0
for index, b in enumerate(booleans):
if b:
previous = index
yield previous
>>> b = [True, False, True, False, False, True]
>>> list(get_indexes(b))
[0, 0, 2, 2, 2, 5]
这甚至更短(虽然可能不太可读):
def get_indexes(booleans):
previous = 0
for index, b in enumerate(booleans):
previous = index if b else previous
yield previous
答案 1 :(得分:1)
试试这个:
index = 0
bools = [True, False, True, False, False, True]
result = []
for i in range(len(bools)):
index = i if bools[i] else index
result.append(index)
未经测试,但应该可以使用。
答案 2 :(得分:0)
[i if b else i-lst[i::-1].index(True) for i,b in enumerate(lst)]