リストをフィルタリングするリスト内包表記があります:
l = [obj for obj in objlist if not obj.mycond()]
しかし、オブジェクト メソッド mycond() は、インターセプトしなければならない例外を発生させる可能性があります。ループの最後にすべてのエラーを収集して、どのオブジェクトが問題を引き起こしたかを示す必要があります。同時に、すべてのリスト要素を確実にループさせたいと考えています。
私の解決策は次のとおりです。
errors = []
copy = objlist[:]
for obj in copy:
try:
if (obj.mycond()):
# avoiding to touch the list in the loop directly
objlist.remove(obj)
except MyException as err:
errors = [err]
if (errors):
#do something
return objlist
この投稿 (リストを複製せずにリスト自体を循環させながらリスト要素を削除する方法) で、リストの重複を避けて循環させるためのより良い方法があるかどうかを尋ねます。
コミュニティは、リストの変更を適切に回避し、例外の問題を無視した場合に適用可能なリスト内包表記を使用するように私に答えました。
あなたの観点で代替ソリューションはありますか?リスト内包表記を使用して、そのように例外を管理できますか? この種の状況で大きなリストを使用している場合 (何が大きいと考えなければなりませんか?)、別の代替手段を見つける必要がありますか?