列表是否包含简短的包含功能?


514

我看到人们正在使用any另一个列表来查看列表中是否存在某项,但是有一种快速的方法吗?

if list.contains(myItem):
    # do something

您的问题意味着您仅对列表包含项感兴趣,而不对列表包含子列表
smci

Answers:


873

您可以使用以下语法:

if myItem in list:
    # do something

同样,逆运算符:

if myItem not in list:
    # do something

它适用于列表,元组,集合和字典(检查键)。

请注意,这是列表和元组中的O(n)操作,而集合和字典中是O(1)操作。


1
对于包含numpy数组的列表,这将检查numpy实例还是numpy实例中的值?
DanielMöller17年

谨防 !这匹配,而这很可能是您没有想到的: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)


在我的情况下,我有一个名为Category的对象列表,并且需要它仅对属性Link进行测试,因此此解决方案更适合我的情况。谢谢
rodrigorf

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.