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


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.