web-dev-qa-db-ja.com

現在リストにない要素の削除:ValueError?

これはしばらくの間私を悩ませてきたものであり、私には理解できませんなぜ誰もが言語がこのように振る舞うことを望んでいるでしょう:

_In [1]: foo = [1, 2, 3]

In [2]: foo.remove(2) ; foo  # okay
Out[2]: [1, 3]

In [3]: foo.remove(4) ; foo  # not okay?
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

/home/izkata/<ipython console> in <module>()

ValueError: list.remove(x): x not in list
_

値がすでにリストにない場合、私は静かに成功すると思います。目標はすでに達成されています。これがこの方法で行われた本当の理由はありますか? すべきがずっと短くなるような厄介なコードを強制します:

_for item in items_to_remove:
   try:
      thingamabob.remove(item)
   except ValueError:
      pass
_

単にの代わりに:

_for item in items_to_remove:
   thingamabob.remove(item)
_

余談ですが、私はset(thingamabob).difference(items_to_remove)を単に使用することはできません。なぜなら、私はdoが順序と重複の両方を保持する必要があるためです。

6
Izkata

Python哲学 から:

明示的は暗黙的よりも優れています

.remove()メソッドは very first commit ;から例外を発生させました。そこにない値を削除しようとすると、そこにない値が問題なく、あなたがずっと望んでいたものであると暗黙的に仮定するのではなく、明示的なフィードバックが得られます。

4
Martijn Pieters

余談ですが、リストが非常に大きく、削除する項目のリストが比較して極端に小さい場合を除き、読み取り可能な1行で項目を除外した新しいリストを作成できます。

filtered_list = [x for x in source_list if x not in set(items_to_remove)]

当然、順序は保持され、必要に応じて複製されます。おそらくそれもより速いです。

多くの場合、データを変更しないことで、アルゴリズムについての考え方が大幅に簡素化されます。

2
9000