set.remove
は、インプレース操作です。これは何も返さないことを意味します(それはNone
を返します)。 bool(None)
はFalse
です。
だからあなたのリストの内包が効果的にこれです:
answer = []
for item in seq:
if item in uniq and not uniq.remove(item):
answer.append(item)
とPythonは条件文の短絡を(他の人が指摘したように)ないので、これは事実である:もちろん
answer = []
for item in seq:
if item in uniq:
if not uniq.remove(item):
answer.append(item)
、以来、 unique.remove(item)
がNone
(bool
のうちいずれかがFalse
)を返した場合は、両方の条件が評価されるか、どちらも評価されません。
第2の条件が存在する理由は、をuniq
から削除することです。あなたは(seq
で重複として)再びitem
に遭遇したとき、それがuniq
から、それが発見された最後の時間を削除されたため、この方法では、/場合は、それがuniq
に記載されていません。今
、この変数を変更する条件として、かなり危険であることを、心に留めておくには悪いスタイル(あなたはそれが何をするかと完全に慣れていない時に、このような条件をデバッグ想像)と考えられています。条件付きの変数は、実際にチェックする変数を変更するべきではありません。したがって、変数を読み込むだけで、変数に書き込むことはできません。これはmgilsonの答え@
私は本当にこのようなコード=) – katrielalex
@katrielalex - 私はしません。コレクションの削除と項目の副作用の条件を使用すると、混乱し、コードを読みにくくなります。 (IMHO) – mgilson
さらに、新しい 'set'をすべて作成し、リストからフィルタとして機能するように、すべてのアイテムをポップします。私はこれがより速いとは想像もできません。そして、間違いなく明確には分かりません。(新しいデュートドリストを作成するための)単一のパスや、(リストの現在のデューピングのための)ダブルパスです。 。 –