假设如下:
>>> s = set([1, 2, 3])
我如何得到一个值(任何值)不做s.pop()?我希望将项目留在集合中,直到我确定可以删除它—只有在对另一个主机进行异步调用之后才能确定这一点。
又快又脏:
>>> elem = s.pop()
>>> s.add(elem)
但你知道更好的办法吗?理想情况是在常数时间内。
假设如下:
>>> s = set([1, 2, 3])
我如何得到一个值(任何值)不做s.pop()?我希望将项目留在集合中,直到我确定可以删除它—只有在对另一个主机进行异步调用之后才能确定这一点。
又快又脏:
>>> elem = s.pop()
>>> s.add(elem)
但你知道更好的办法吗?理想情况是在常数时间内。
当前回答
最少的代码是:
>>> s = set([1, 2, 3])
>>> list(s)[0]
1
显然,这将创建一个包含集合中的每个成员的新列表,所以如果你的集合非常大,就不太好了。
其他回答
另一种选择是使用包含您不关心的值的字典。例如,
poor_man_set = {}
poor_man_set[1] = None
poor_man_set[2] = None
poor_man_set[3] = None
...
你可以把键作为一个集合,除了它们只是一个数组:
keys = poor_man_set.keys()
print "Some key = %s" % keys[0]
这种选择的一个副作用是,您的代码将向后兼容旧的预先设置的Python版本。这可能不是最好的答案,但这是另一种选择。
编辑:你甚至可以这样做来隐藏你使用字典而不是数组或集合的事实:
poor_man_set = {}
poor_man_set[1] = None
poor_man_set[2] = None
poor_man_set[3] = None
poor_man_set = poor_man_set.keys()
两个不需要复制整个集合的选项:
for e in s:
break
# e is now an element from s
还是……
e = next(iter(s))
但一般来说,集合不支持索引或切片。
看似最紧凑(6个符号),但非常慢的方法来获得一个集合元素(由PEP 3132实现):
e,*_=s
使用Python 3.5+,你也可以使用这个7符号表达式(感谢PEP 448):
[*s][0]
在我的机器上,这两个选项都比for循环方法慢大约1000倍。
我用的是我写的效用函数。它的名字有点误导,因为它暗示它可能是一个随机的项目或类似的东西。
def anyitem(iterable):
try:
return iter(iterable).next()
except StopIteration:
return None
你可以解包这些值来访问元素:
s = set([1, 2, 3])
v1, v2, v3 = s
print(v1,v2,v3)
#1 2 3