Python列表中两个“包含”操作的区别

3 投票
4 回答
709 浏览
提问于 2025-04-17 04:39

我刚开始学习Python,发现我需要检查一个列表里是否包含某个特定的项目。
我在很多网站上看到的帖子(包括这个类似的StackOverflow问题)大多数都建议使用下面这种方法:

for i in list
    if i == thingIAmLookingFor
        return True

不过,我在一个小论坛上发现了另一种方法:

if thingIAmLookingFor in list
    # do work

也能奏效。

我在想,if thing in list这种写法是不是for i in list的简化版,或者它们的实现方式有什么不同。

我也想知道这两种方法中,哪种更受欢迎。

4 个回答

1

使用 if thing in somelist 是最推荐和最快的方法。

其实,这个使用“in”的操作符在后台会变成 somelist.__contains__(thing),它的实现方式其实是: any((x is thing or x == thing) for x in somelist)

注意,这里的条件先检查的是身份(也就是是否是同一个对象),然后再检查相等性(也就是值是否相同)。

2

“if x in thing:” 这种写法是非常推荐的,不仅因为它代码更少,还因为它可以在其他数据类型上使用,而且我觉得它更容易理解。

我不太清楚它是怎么实现的,但我想在一些以更易查找的方式存储的数据类型上,它的效率会高很多,比如集合或字典的键。

4

在你简单的例子中,使用 in 当然是更好的选择。

不过... 在你提到的那个问题中,in 并不能直接使用,因为提问者并不是想找一个和某个东西完全相等的对象,而是想找一个它的属性 n 等于某个值的对象。

有一个回答提到了在列表推导式中使用 in,不过我不太明白为什么不直接用生成器表达式呢:

if 5 in (data.n for data in myList):
    print "Found it"

但这和其他方法相比,几乎没有什么改进,比如使用 any 的这个方法:

if any(data.n == 5 for data in myList):
    print "Found it"

撰写回答