Проверьте, есть ли что-то (нет) в списке в 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)