Проверьте, есть ли что-то (нет) в списке в Python

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

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

    # Do Something

На самом деле это не работает для меня. Что я сделал неправильно?

Ответ 1

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

>>> 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

Ответ 2

Как проверить, есть ли что-то (нет) в списке в Python?

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

Операторы in и not in тесте на членство. x in s оценивается как True если x является членом s, и False противном случае. x not in s возвращает отрицание x in s.

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

Оператор not in определен так, чтобы иметь обратное истинное значение 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

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

... in а not in, поддерживаются итеративными типами или реализуют метод __contains__(). Например, вы можете (но не должны) сделать это:

[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 может быть использован для получения индекса элемента. Если этот элемент не существует, возникает ValueError.
  • list.count может быть использован, если вы хотите подсчитать вхождения.

Проблема XY: вы рассматривали set s?

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

  • Вам нужно проверить, есть ли элемент в списке более одного раза?
  • Эта проверка выполняется внутри цикла или функция вызывается повторно?
  • Элементы, которые вы храните в своем списке, можно изменить? IOW, вы можете назвать hash на них?

Если вы ответили "да" на эти вопросы, вы должны вместо этого использовать set. Тест in членство в list - 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)

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

Ответ 3

 lst = list(range(10))
 a = int(input("Enter any number : "))
 if(a in lst):
    print("in list") # print in list if number in list
 else:
    print("not in list")  # print not in list if number is not in list

Ответ 4

a = [23, 11, 21, 34, 53, 89, 133, 211, 345, 535, 895]

b = [11, 32, 33, 45, 25, 66, 87, 863, 97, 130, 141, 126, 13]

x=[]
for i in a:
    for j in b:
        if i==j and j not in x:
            x.append(j)

print(x)