У меня есть список кортежей в Python , и у меня есть условие, где я хочу взять ветвь ТОЛЬКО если кортежа нет в списке (если он в списке, то я не хочу брать ветку if)
if curr_x -1 > 0 and (curr_x-1 , curr_y) not in myList:
# Do Something
Это на самом деле не работает для меня, хотя. Что я сделал не так?
3 -1 > 0 and (4-1 , 5) not in []
⤇True
поэтому ошибка не является одним из приоритетов операторов.myList.count((curr_x, curr_y))
, если(curr_x, curr_y)
не вmyList
, результат будет0
Ответы:
Ошибка, вероятно, где-то еще в вашем коде, потому что она должна работать нормально:
Или с кортежами:
источник
if not ELEMENT in COLLECTION:
A not in B
сводится к тому, что делать,not B.__contains__(A)
то же самое, чтоnot A in B
сводится к тому, что естьnot B.__contains__(A)
.__notcontains__
. Извините, тогда то, что я сказал, это просто фигня.not
иметь более высокий приоритет, чем тот,in
которого нет. Рассмотрим результат,ast.dump(ast.parse("not A in B").body[0])
который приводит к тому, что"Expr(value=UnaryOp(op=Not(), operand=Compare(left=Name(id='A', ctx=Load()), ops=[In()], comparators=[Name(id='B', ctx=Load())])))"
еслиnot
сгруппировать тесно в A, можно было бы ожидать, что результатом будет"Expr(value=Compare(left=UnaryOp(op=Not(), operand=Name(id='A', ctx=Load())), ops=[In()], comparators=[Name(id='B', ctx=Load())]))"
синтаксический анализ"(not A) in B"
.Самое дешевое и удобочитаемое решение - использование
in
оператора (или в вашем конкретном случаеnot in
). Как указано в документации,Дополнительно,
y not in x
логически так же, какnot y in x
.Вот несколько примеров:
Это также работает с кортежами, так как кортежи являются хэшируемыми (вследствие того, что они также являются неизменяемыми):
Если объект в RHS определяет
__contains__()
метод, онin
будет внутренне вызывать его, как указано в последнем абзаце раздела « Сравнения » документации.in
короткие замыкания, поэтому, если ваш элемент находится в начале списка,in
вычисляется быстрее:Если вы хотите сделать больше, чем просто проверить, есть ли элемент в списке, есть варианты:
list.index
может быть использован для получения индекса элемента. Если этот элемент не существует, aValueError
повышается.list.count
может быть использован, если вы хотите подсчитать вхождения.Проблема XY: Вы рассматривали
set
с?Задайте себе эти вопросы:
hash
им?Если вы ответили «да» на эти вопросы, вы должны использовать
set
вместо этого. Проверкаin
членства наlist
s - это O (n) сложность времени. Это означает, что python должен выполнить линейное сканирование вашего списка, посещая каждый элемент и сравнивая его с элементом поиска. Если вы делаете это неоднократно или если списки велики, эта операция повлечет за собой дополнительные затраты.set
объекты, с другой стороны, хэшируют свои значения для проверки членства в постоянное время. Проверка также выполняется с использованиемin
:Если вам не повезло, что элемент, который вы ищете / не ищете, находится в конце вашего списка, python просканирует список до конца. Это видно из времени ниже:
Напоминаем, что это подходящий вариант, если элементы, которые вы храните и просматриваете, являются хэшируемыми. Таким образом, они должны быть неизменяемыми типами или объектами, которые реализуют
__hash__
.источник