and
およびor
式がPythonに存在することは知っていますが、and/or
式はありますか?または、それらを組み合わせてand/or
式と同じ効果を生成する方法はありますか?
私のコードは次のようになります:
if input=="a":
if "a" or "á" or "à" or "ã" or "â" in someList:
someList.remove("a") or someList.remove("á") or someList.remove("à") or someList.remove("ã") or someList.remove("â")
これにより、ユーザーが「a」を入力し、任意のタイプの「a」が以前に定義されたリストに含まれている場合、特定のリストから「a」のすべてのタイプを削除できますか?
pythonは、問題があることを教えてくれます:
someList.remove("a") or someList.remove("á") or someList.remove("à") or someList.remove("ã") or someList.remove("â")
彼は私に言う:ValueError: list.remove(x): x not in list
マットボール の答えが説明するように、or
is "and/or"。ただし、or
はin
で上記のように使用できません。 if "a" in someList or "á" in someList or...
と言う必要があります。または、さらに良い、
if any(c in someList for c in ("a", "á", "à", "ã", "â")):
...
それはあなたの質問に対する答えです。
ただし、投稿したサンプルコードについては、さらにいくつか説明する必要があります。まず、ここでのsomeList.remove... or someList remove...
ステートメントのチェーンは不要であり、予期しない動作を引き起こす可能性があります。読みにくいです!個々の行に分割することをお勧めします。
someList.remove("a")
someList.remove("á")
...
ただし、それでも十分ではありません。ご覧のとおり、アイテムがリストにない場合、エラーがスローされます。それに加えて、remove
の使用は非常に遅いです。なぜなら、呼び出すたびにPythonはリスト内のすべてのアイテムを見る必要があるからです。したがって、10個の異なる文字を削除する場合、100個の文字を含むリストがある場合は、1000回のテストを実行する必要があります。
代わりに、非常に異なるアプローチを提案します。次のように、set
を使用してリストをフィルタリングします。
chars_to_remove = set(("a", "á", "à", "ã", "â"))
someList = [c for c in someList if c not in chars_to_remove]
または、コピーを作成せずにリストをその場で変更します。
someList[:] = (c for c in someList if c not in chars_to_remove)
これらは両方ともリスト内包構文を使用して新しいリストを作成します。 someList
のすべての文字を調べ、chars_to_remove
にある文字を確認し、そうでない場合は、新しいリストに文字を含めます。
これは、このコードの最も効率的なバージョンです。 2つの速度の利点があります。
someList
を一度だけ通過します。上記のシナリオでは、1000回のテストを実行する代わりに、100回だけ実行します。chars_to_remove
はset
であるため、1回の操作ですべての文字をテストできます。 chars_to_remove
がlist
またはTuple
である場合、リスト内の各文字を個別にチェックする必要があるため、上記のシナリオでは各テストは実際には10個のテストになります。or
は排他的ではありません(例 xor
)。したがって、or
はand/or
と同じものです。
x and y
は、x
とy
の両方がtrue
である場合にtrueを返します。x or y
は、どちらかがtrue
の場合に戻ります。
これから、or
を意味する場合を除き(またはand
がtrueの場合を除く)、xOR
自体にand
が含まれると結論付けることができます。
何方をお探しですか...
a if b else c
あるいは、Pythonのor
を誤解しているかもしれません。 True or True
はTrue
です。
更新された質問については、必要なものを次のようなものに置き換えることができます。
someList = filter(lambda x: x not in ("a", "á", "à", "ã", "â"), someList)
filter
は、リストのすべての要素を、指定されたラムダに渡すことで評価します。このラムダでは、要素がリストに残っている必要があるため、要素が提供された文字のいずれでもないかどうかをチェックします。
または、someList
のアイテムが一意でなければならない場合は、someList
をセットにして、次のようにすることができます。
someList = list(set(someList)-set(("a", "á", "à", "ã", "â")))
これは基本的にセット間の差を取り、それはあなたが望むことをしますが、リストとは異なり、すべての要素が一度だけ発生することも保証します。この場合、最初からsomeList
をセットとして保存できることに注意してください。少し最適化されます。