3

假设我们有以下集合 ,S和值v

S = {(0,1),(2,3),(4,5)}
v = 3

我想测试是否v是集合中任何对的第二个元素。我目前的做法是:

for _, y in S:
    if y == v:
        return True
return False

我真的不喜欢这样,因为我必须把它放在一个单独的函数中,并且有些东西告诉我可能有更好的方法来做到这一点。任何人都可以解释一下吗?

4

3 回答 3

6

any功能是为此量身定制的:

any( y == v for (_, y) in S )

如果您有一个不经常更改的大集合,您可能希望将 y 值投影到一个集合上。

yy = set( y for (_, y) in S )
v in yy

当然,这仅在您在更改yy后计算一次S而不是在每次成员资格测试之前计算时才有用。

于 2012-05-17T01:34:29.140 回答
2

您无法进行 O(1) 查找,因此您不会从拥有一个集合中获得太多好处。您可能会考虑构建第二个集合,特别是如果您将进行大量查找。

S = {(0,1), (2,3), (4,5)}
T = {x[1] for x in S}

v = 3
if v in T:
    # do something
于 2012-05-17T01:39:15.997 回答
1

简单的答案是any(见马塞洛的回答)。

替代方案是zip.

>>> zip(*S)
[(4, 0, 2), (5, 1, 3)]
>>> v in zip(*S)[1]
True
于 2012-05-17T01:46:39.360 回答