1

我经常遇到类似以下问题的问题,并且很难编写干净的代码来解决它。通常,我有一些涉及临时变量和 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。

4

3 回答 3

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
于 2013-01-03T04:08:26.390 回答
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)

未经测试,但应该可以工作。

于 2013-01-03T04:12:07.433 回答
0
[i if b else i-lst[i::-1].index(True) for i,b in enumerate(lst)]
于 2013-01-03T04:45:28.127 回答