Чи є коротка функція містить списки?


514

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

if list.contains(myItem):
    # do something

Ваше запитання означає, що вас цікавить лише те, що список містить предмет , а не список містить підспис? / кортеж / комплект / заморожений набір / ...?
smci

Відповіді:


873

Ви можете використовувати цей синтаксис:

if myItem in list:
    # do something

Також зворотний оператор:

if myItem not in list:
    # do something

Це чудово працює для списків, кортежів, наборів та диктів (контрольні клавіші).

Зауважте, що це операція O (n) у списках та кортежах, але операція O (1) у множинах та диктах.


1
Чи буде цей список зі списком, що містить масиви numpy, перевіряти наявні випадки чи значення всередині екземплярів numpy?
Даніель Мьоллер

Остерігайся! Це збіги, хоча це, мабуть, те, чого ви не очікували:o='--skip'; o in ("--skip-ias"); # returns True !
Alex F

3
@AlexF: Це відповідає тому, що ("--skip-ias")це не кортеж, а рядок (круглі дужки нічого не роблять, як (1)і лише ціле число). Якщо ви хочете 1-кортеж, вам потрібно додати кому після одного елемента: ("--skip-ias",)(або (1,)).
Blckknght

Зауважте, що якщо ви порівнюєте символів, це нечутливе до регістру.
Тілсон

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)


У моєму випадку у мене є перелік об'єкта під назвою Категорія і потрібно його перевірити лише для властивості Link, тому це рішення краще підходить для мого випадку. Спасибі
rodrigorf

3
any(item == test_item for item in list_to_test)працював би теж, я думаю?
хтось

3

Метод списку 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.