假设如下:

>>> s = set([1, 2, 3])

我如何得到一个值(任何值)不做s.pop()?我希望将项目留在集合中,直到我确定可以删除它—只有在对另一个主机进行异步调用之后才能确定这一点。

又快又脏:

>>> elem = s.pop()
>>> s.add(elem)

但你知道更好的办法吗?理想情况是在常数时间内。


当前回答

你可以解包这些值来访问元素:

s = set([1, 2, 3])

v1, v2, v3 = s

print(v1,v2,v3)
#1 2 3

其他回答

我用的是我写的效用函数。它的名字有点误导,因为它暗示它可能是一个随机的项目或类似的东西。

def anyitem(iterable):
    try:
        return iter(iterable).next()
    except StopIteration:
        return None

s.copy().pop()怎么样?我还没有计时,但应该可以,而且很简单。但是,它最适用于小集,因为它复制了整个集。

最少的代码是:

>>> s = set([1, 2, 3])
>>> list(s)[0]
1

显然,这将创建一个包含集合中的每个成员的新列表,所以如果你的集合非常大,就不太好了。

在Python 3中还有另一种方法:

next(iter(s))

or

s.__iter__().__next__()

看似最紧凑(6个符号),但非常慢的方法来获得一个集合元素(由PEP 3132实现):

e,*_=s

使用Python 3.5+,你也可以使用这个7符号表达式(感谢PEP 448):

[*s][0]

在我的机器上,这两个选项都比for循环方法慢大约1000倍。