AND/OR в Python?

Я знаю, что выражения 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

+22
13 апр. '12 в 23:51
источник поделиться
6 ответов

Как объясняет 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, а если это не так, они включают символ в новый список.

Это наиболее эффективная версия этого кода. Он имеет два преимущества скорости:

  • Он проходит только через someList один раз. Вместо того, чтобы выполнять 1000 тестов, в приведенном выше сценарии он выполняет только 100.
  • Он может тестировать все символы с одной операцией, потому что chars_to_remove является set. Если он chars_to_remove был list или tuple, то каждый тест действительно был бы 10 тестами в вышеупомянутом сценарии - потому что каждый символ в списке нужно будет проверять индивидуально.
+22
14 апр. '12 в 0:13
источник

or не является эксклюзивным (например, xor), поэтому or - это то же самое, что и and/or.

+9
13 апр. '12 в 23:53
источник

x and y возвращает true, если оба x и y равны true.
x or y возвращает, если один из них равен true.

Из этого можно заключить, что or содержит and внутри себя, если вы не имеете в виду xOR (или кроме if and is true)

+7
13 апр. '12 в 23:53
источник

Вы ищете...

a if b else c

Или, может быть, вы неправильно поняли Python or? True or True - True.

+3
13 апр. '12 в 23:53
источник

В обновленном вопросе вы можете заменить то, что хотите, на что-то вроде:

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

filter оценивает каждый элемент списка, передавая его предоставленному лямбда. В этой лямбде мы проверяем, не является ли элемент не одним из символов, потому что они должны оставаться в списке.

В качестве альтернативы, если элементы в someList должны быть уникальными, вы можете сделать someList набор и сделать что-то вроде этого:

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

Это существенно отличается от множества, которое делает то, что вы хотите, но также гарантирует, что каждый элемент возникает только один раз, который отличается от списка. Обратите внимание, что вы можете сохранить someList как набор с начала в этом случае, он немного оптимизирует вещи.

+2
14 апр. '12 в 0:23
источник
if input == 'a':
    for char in 'abc':
        if char in some_list:
            some_list.remove(char)
-2
14 апр. '12 в 13:11
источник

Посмотрите другие вопросы по меткам или Задайте вопрос