3

在 Python 中,我可以测试一个元素是否在列表中,如下所示:

elem = 56
long_list = ["foo", "bar", asdf, 56, False]
print(elem in long_list) # "True"

这相当于:

elem = 56
long_list = ["foo", "bar", asdf, 56, False]

result = False
for candidate in long_list:
    if elem == candidate:
        result = True
        break
print(result) # "True"

注意elem == candidate,它测试相等性

我想要做的是使用而不是测试身份elem is candidate。在 Python 中执行此操作的最简单方法是什么?

我试过谷歌,但不幸的是,“是”和“在”这两个词太常见了。我也试过

print(elem is in long_list)

但这给了我一个语法错误。

4

3 回答 3

4

Use any with a generator expression:

any(elem is candidate for candidate in long_list)
于 2013-03-22T20:46:39.657 回答
2

我可能误解了这个问题,但是如果一个对象没有实现__eq__in并且==默认为身份比较,这就是你想要的。

class Foo:
    pass

a = Foo()
b = Foo()
c = Foo()

print (a in [a,b]) # True 
print (c in [a,b]) # False
于 2013-03-22T20:54:04.380 回答
0

如果被比较的元素__eq__按照 实现is,您可以简单地使用elem in long_list它,它将自动为您调用。所以这应该适用于您的对象:

def __eq__(self, x):
    return self is x

为简单起见,这里有一个小演示,它重载相等为str.startswith(第二个操作数的)而不是身份。

>>> class permissive(str):
        def __eq__(self, x):
            return self.startswith(x)

>>> mylist = map(permissive, [ "hip", "hop" ])
>>> "hi" in mylist
True

当然,在其他上下文中比较对象是否相等时,您将获得相同的超严格行为。如果您的目标只是在列表中查找特定对象,也许您应该定义__hash__并将它们存储在字典中?

于 2013-03-22T20:51:46.033 回答