Python:使用先前发生的索引进行映射

时间:2013-01-03 03:59:45

标签: python

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

3 个答案:

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