5

次の質問に対する回避策があります。その回避策は、次のような出力に含めるためのテストを含む for ループです。

#!/usr/bin/env python

def rem_dup(dup_list):
    reduced_list = []
    for val in dup_list:
        if val in reduced_list:
            continue
        else:
            reduced_list.append(val)

    return reduced_list

リスト内包表記の解決策があるかどうか知りたいので、次の質問をしています。

次のデータがあるとします。

reduced_vals = []
vals = [1, 2, 3, 3, 2, 2, 4, 5, 5, 0, 0]

なぜ

reduced_vals = = [x for x in vals if x not in reduced_vals]

同じリストを作成しますか?

>>> reduced_vals
[1, 2, 3, 3, 2, 2, 4, 5, 5, 0, 0]

reduced_valsリストへの割り当ての一部として出力( )をチェックすることに関係があると思います。正確な理由については興味があります。

ありがとうございました。

4

5 に答える 5

6

リスト内包表記は新しいリストを作成しますreduced_valsが、リスト内包表記の評価中は常に空のリストを指します。

Python での割り当てのセマンティクスは次のとおりです。右側を評価し、結果のオブジェクトを左側の名前にバインドします。裸の名前への割り当ては、オブジェクトを決して変更しません。

ところで、効率的な方法で重複を削除するにはset()orを使用collections.OrderedDict.fromkeys()する必要があります (順序を維持する必要があるかどうかによって異なります)。

于 2012-07-16T13:53:54.953 に答える
4

空のリストに対してテストしています。

式は、の新しい値として割り当てる前に、最初に完全にreduced_vals評価されます。したがって、完全なリスト式が評価されるまで、式は空のままになります。

言い換えると、式[x for x in vals if x not in reduced_vals]は単独で実行されます。コードを少し変更して表示すると役立つ場合があります。

temp_var = [x for x in vals if x not in reduced_vals]
reduced_vals = temp_var
del temp_var

上記は、リスト式の結果をに直接割り当てることと道徳的に同等ですがreduced_vals、2番目の変数を使用して結果を割り当てることをより明確に分離しました。

于 2012-07-16T13:54:06.280 に答える
4

この行では、空のリストのように、にない[x for x in vals if x not in reduced_vals]値は1つもありません。つまり、何もフィルタリングされず、のすべての要素が返されます。reduced_valsreduced_vals[]vals

これを試してみると:

[x for x in vals if x in reduced_vals]

すべての値が含まれていない(空である)ため、結果は空のリスト[]になります。リスト内包表記でフィルタリング部分がどのように機能するかについて混乱していると思います。ご覧のとおり、フィルターは条件を構成する値のみを選択しますが、値の重複を防ぐことはできません。reduced_valsTrue

さて、必要なのが重複を除外することである場合、リスト内包はその仕事に適したツールではありません。そのためには、セットを使用します-元のリストの順序を必ずしも保持するわけではありませんが、要素が一意であることを保証します。

vals = [1, 2, 3, 3, 2, 2, 4, 5, 5, 0, 0]
list(set(vals))
> [0, 1, 2, 3, 4, 5]
于 2012-07-16T13:54:07.030 に答える
1

リスト内包表記の要素は、リストreduced_vals全体が構築されるまで割り当てられないためです。これを機能させたい場合は、forループを使用してください。.append()

于 2012-07-16T13:53:56.723 に答える
0

reduced_valsリスト内包の評価中に変化しないためです。

于 2012-07-16T13:54:45.833 に答える