Вопрос по python, membership, list – Проверьте, есть ли что-то (нет) в списке в Python

227

У меня есть список кортежей впитони у меня есть условие, где я хочу взять ветвь ТОЛЬКО если кортежа нет в списке (если он есть в списке, то я не хочу брать ветку if)

<code>if curr_x -1 > 0 and (curr_x-1 , curr_y) not in myList: 

    # Do Something
</code>

Это не очень работает для меня, хотя. Что я сделал не так?

Не используйтеlist как имя переменной. Что здесь выводится ошибка? bossylobster
Обратите внимание, что3 -1 > 0 and (4-1 , 5) not in [] & # X2907;True следовательно, ошибка не является приоритетом оператора. Dan D.
Что ты имеешь в виду под словом "не работает на меня"? Что вы ожидаете случиться? Что на самом деле происходит? Какой точный список содержимого вызывает проблему? Karl Knechtel
Почему бы не попробоватьmyList.count((curr_x, curr_y)), если(curr_x, curr_y) не вmyListрезультат будет0 LittleLittleQ

Ваш Ответ

2   ответа
355

Ошибка, вероятно, где-то еще в вашем коде, потому что она должна работать нормально:

>>> 3 not in [2, 3, 4]
False
>>> 3 not in [4, 5, 6]
True

Или с кортежами:

>>> (2, 3) not in [(2, 3), (5, 6), (9, 1)]
False
>>> (2, 3) not in [(2, 7), (7, 3), "hi"]
True
Error: User Rate Limit ExceededA not in BError: User Rate Limit Exceedednot B.__contains__(A)Error: User Rate Limit Exceedednot A in BError: User Rate Limit Exceedednot B.__contains__(A).
Error: User Rate Limit Exceededbloom filters.
Error: User Rate Limit Exceededif not ELEMENT in COLLECTION:
Error: User Rate Limit ExceededCOLLECTIONError: User Rate Limit ExceededELEMENT in DICTIONARYError: User Rate Limit Exceededin DICTIONARY.keys()Error: User Rate Limit Exceeded
Error: User Rate Limit ExceedednotError: User Rate Limit ExceededinError: User Rate Limit Exceededast.dump(ast.parse("not A in B").body[0])Error: User Rate Limit Exceeded"Expr(value=UnaryOp(op=Not(), operand=Compare(left=Name(id='A', ctx=Load()), ops=[In()], comparators=[Name(id='B', ctx=Load())])))"Error: User Rate Limit ExceedednotError: User Rate Limit Exceeded"Expr(value=Compare(left=UnaryOp(op=Not(), operand=Name(id='A', ctx=Load())), ops=[In()], comparators=[Name(id='B', ctx=Load())]))"Error: User Rate Limit Exceeded"(not A) in B".
3
How do I check if something is (not) in a list in Python?

in оператор (или в вашем конкретном случае,not in). Как указано в документации,

The operators in and not in test for membership. x in s evaluates to True if x is a member of s, and False otherwise. x not in s returns the negation of x in s.

Дополнительно,

The operator not in is defined to have the inverse true value of in.

y not in x логически так же, какnot y in x.

Вот несколько примеров:

'a' in [1, 2, 3]
# False

'c' in ['a', 'b', 'c']
# True

'a' not in [1, 2, 3]
# True

'c' not in ['a', 'b', 'c']
# False

Это также работает с кортежами, так как кортежи являются хэшируемыми (как следствие того факта, что они также являются неизменяемыми):

(1, 2) in [(3, 4), (1, 2)]
#  True

Если объект в RHS определяет__contains__() метод,in внутренне позвонит, как отмечено в последнем абзацеСравнения раздел документов.

... in and not in, are supported by types that are iterable or implement the __contains__() method. For example, you could (but shouldn't) do this:

[3, 2, 1].__contains__(1)
# True

in коротких замыканий, так что если ваш элемент находится в начале списка,in оценивает быстрее:

lst = list(range(10001))
%timeit 1 in lst
%timeit 10000 in lst  # Expected to take longer time.

68.9 ns ± 0.613 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
178 µs ± 5.01 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

Если вы хотите сделать больше, чем просто проверить, есть ли элемент в списке, есть варианты:

list.index can be used to retrieve the index of an item. If that element does not exist, a ValueError is raised. list.count can be used if you want to count the occurrences. The XY Problem: Have you considered sets?

Задайте себе эти вопросы:

do you need to check whether an item is in a list more than once? Is this check done inside a loop, or a function called repeatedly? Are the items you're storing on your list hashable? IOW, can you call hash on them?

Если вы ответили "да" на эти вопросы, вы должны использоватьset вместо.in членский тест наlists - O (n) сложность времени. Это означает, что python должен выполнить линейное сканирование вашего списка, посещая каждый элемент и сравнивая его с элементом поиска. Если вы делаете это неоднократно или если списки велики, эта операция потребует дополнительных затрат.

set объекты, с другой стороны, хэшируют свои значения для проверки членства в постоянное время. Проверка также выполняется с использованиемin:

1 in {1, 2, 3} 
# True

'a' not in {'a', 'b', 'c'}
# False

(1, 2) in {('a', 'c'), (1, 2)}
# True

Если вам не повезло, что элемент, который вы ищете / не ищете, находится в конце вашего списка, python просканирует список до конца. Это видно из времени ниже:

l = list(range(100001))
s = set(l)

%timeit 100000 in l
%timeit 100000 in s

2.58 ms ± 58.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
101 ns ± 9.53 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

Напомним, что это подходящий вариант, если элементы, которые вы храните и просматриваете, являются хэшируемыми. IOW, они должны быть неизменяемыми типами или объектами, которые реализуют__hash__.

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededO(n)Error: User Rate Limit Exceeded

Похожие вопросы