Есть ли краткая функция для списков?


515

Я вижу, что люди используют, anyчтобы собрать другой список, чтобы увидеть, существует ли элемент в списке, но есть ли быстрый способ сделать это ?:

if list.contains(myItem):
    # do something

Ваш вопрос подразумевает, что вы заинтересованы только в том, что список содержит элемент , а не список содержит подсписок? / tuple / set / frozenset / ...?
smci

Ответы:


875

Вы можете использовать этот синтаксис:

if myItem in list:
    # do something

Также обратный оператор:

if myItem not in list:
    # do something

Это отлично работает для списков, кортежей, наборов и диктовок (проверьте ключи).

Обратите внимание, что это операция O (n) в списках и кортежах, но операция O (1) в наборах и диктатах.


1
Если список содержит пустые массивы, будет ли это проверять наличие пустых экземпляров или значений внутри пустых экземпляров?
Даниэль Мёллер

Осторожно! Это соответствует, в то время как это очень вероятно, что вы не ожидали:o='--skip'; o in ("--skip-ias"); # returns True !
Alex F

3
@AlexF: Это соответствует, потому что ("--skip-ias")это не кортеж, а строка (круглые скобки ничего не делают, как будто (1)это просто целое число). Если вам нужен 1-кортеж, вам нужно добавить запятую после одного элемента: ("--skip-ias",)(или (1,)).
Blckknght

Обратите внимание, что если вы сравниваете символы, это без учета регистра.
Tillson

65

В дополнение к тому, что сказали другие, вам также может быть интересно узнать, что inзначит вызывать list.__contains__метод, который вы можете определить для любого класса, который вы пишете, и который может стать чрезвычайно удобным для использования Python в полной мере.  

Глупое использование может быть:

>>> class ContainsEverything:
    def __init__(self):
        return None
    def __contains__(self, *elem, **k):
        return True


>>> a = ContainsEverything()
>>> 3 in a
True
>>> a in a
True
>>> False in a
True
>>> False not in a
False
>>>         

5

Я недавно придумал этот вкладыш, чтобы Trueузнать, содержит ли список какое-либо количество вхождений элемента или Falseесли он не содержит вхождений или вообще ничего. Использование next(...)дает этому возвращаемое значение по умолчанию ( False) и означает, что оно должно работать значительно быстрее, чем выполнение полного списка.

list_does_contain = next((True for item in list_to_test if item == test_item), False)


В моем случае у меня есть список объектов с именем Category, и мне нужно его протестировать только для свойства Link, поэтому в моем случае это решение подходит лучше. Спасибо
Родригорф

3
any(item == test_item for item in list_to_test)будет работать тоже, я думаю?
кто-то

3

Метод list indexвернется, -1если элемент отсутствует, и вернет индекс элемента в списке, если он присутствует. В качестве альтернативы в ifзаявлении вы можете сделать следующее:

if myItem in list:
    #do things

Вы также можете проверить, нет ли элемента в списке, с помощью следующего оператора if:

if myItem not in list:
    #do things

15
indexМетод не возвращает -1 , если элемент отсутствует, он выбрасывает ValueErrorисключение.
MondKin
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.