web-dev-qa-db-ja.com

PythonでAND / ORですか?

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

38
JNat

マットボール の答えが説明するように、oris "and/or"。ただし、orinで上記のように使用できません。 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つの速度の利点があります。

  1. someListを一度だけ通過します。上記のシナリオでは、1000回のテストを実行する代わりに、100回だけ実行します。
  2. chars_to_removesetであるため、1回の操作ですべての文字をテストできます。 chars_to_removelistまたはTupleである場合、リスト内の各文字を個別にチェックする必要があるため、上記のシナリオでは各テストは実際には10個のテストになります。
38
senderle

orは排他的ではありません(例 xor )。したがって、orand/orと同じものです。

15
Matt Ball

x and yは、xyの両方がtrueである場合にtrueを返します。
x or yは、どちらかがtrueの場合に戻ります。

これから、orを意味する場合を除き(またはandがtrueの場合を除く)、xOR自体にandが含まれると結論付けることができます。

14
user1241335

何方をお探しですか...

a if b else c

あるいは、Pythonのorを誤解しているかもしれません。 True or TrueTrueです。

5
Amber

更新された質問については、必要なものを次のようなものに置き換えることができます。

someList = filter(lambda x: x not in ("a", "á", "à", "ã", "â"), someList)

filterは、リストのすべての要素を、指定されたラムダに渡すことで評価します。このラムダでは、要素がリストに残っている必要があるため、要素が提供された文字のいずれでもないかどうかをチェックします。

または、someListのアイテムが一意でなければならない場合は、someListをセットにして、次のようにすることができます。

someList = list(set(someList)-set(("a", "á", "à", "ã", "â")))

これは基本的にセット間の差を取り、それはあなたが望むことをしますが、リストとは異なり、すべての要素が一度だけ発生することも保証します。この場合、最初からsomeListをセットとして保存できることに注意してください。少し最適化されます。

4
KillianDS