40

andor式が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

4

7 に答える 7

40

Matt Ballの答えが説明しているように、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 つの速度の利点があります。

  1. 一度だけ通過しsomeListます。上記のシナリオでは、1000 回のテストを実行する代わりに、100 回だけ実行します。
  2. chars_to_removeset. _ またはの場合、上記のシナリオでchars_to_removeは、各テストは実際には 10 個のテストになります。これは、リスト内の各文字を個別にチェックする必要があるためです。listtuple
于 2012-04-14T00:13:16.037 に答える
15

or排他的ではない(例xor)のでor、と同じですand/or

于 2012-04-13T23:53:31.087 に答える
15

x and yxとの両方yがである場合、 true を返しますtrue
x or yいずれかが の場合に返しますtrue

このことから、あなたが意味しない限り(またはtrue の場合を除いて) はそれ自体の中にor含まれていると結論付けることができます。andxORand

于 2012-04-13T23:53:32.417 に答える
5

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

a if b else c

それとも、Python のor. True or TrueですTrue

于 2012-04-13T23:53:31.853 に答える
4

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

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

filter提供されたラムダに渡すことにより、リストのすべての要素を評価します。このラムダでは、要素が提供された文字の 1 つではないかどうかを確認します。これは、これらの文字がリストに残る必要があるためです。

別の方法として、アイテムをsomeList一意にする必要がある場合はsomeList、セットを作成して次のようにすることもできます。

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

これは基本的にセット間の違いを取得します。これにより、必要なことが行われますが、リストとは異なり、すべての要素が 1 回だけ発生するようになります。someListこの場合、最初からセットとして保存できることに注意してください。これにより、物事が少し最適化されます。

于 2012-04-14T00:23:36.733 に答える
-3
if input == 'a':
    for char in 'abc':
        if char in some_list:
            some_list.remove(char)
于 2012-04-14T13:11:34.833 に答える