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 に答える