假设如下:
>>> 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)
但你知道更好的办法吗?理想情况是在常数时间内。
当前回答
在Python 3中还有另一种方法:
next(iter(s))
or
s.__iter__().__next__()
其他回答
因为你想要一个随机元素,这也可以:
>>> import random
>>> s = set([1,2,3])
>>> random.sample(s, 1)
[2]
文档中似乎没有提到random.sample的性能。从一个非常快速的经验测试中,有一个巨大的列表和一个巨大的集合,对于列表来说似乎是常数时间,而对于集合来说则不是。而且,集合上的迭代不是随机的;顺序没有定义,但可以预测:
>>> list(set(range(10))) == range(10)
True
如果随机性很重要,并且你需要在常数时间内(大型集合)使用一堆元素,那么我会使用随机性。先采样并转换为列表:
>>> lst = list(s) # once, O(len(s))?
...
>>> e = random.sample(lst, 1)[0] # constant time
两个不需要复制整个集合的选项:
for e in s:
break
# e is now an element from s
还是……
e = next(iter(s))
但一般来说,集合不支持索引或切片。
如果你只想要第一个元素,试试这个: B = (a-set())).pop()
对于小型集合,我通常会创建类似这样的解析器/转换器方法
def convertSetToList(setName):
return list(setName)
然后我可以使用新的列表和访问索引号
userFields = convertSetToList(user)
name = request.json[userFields[0]]
作为一个列表,您将拥有所有其他可能需要使用的方法
你可以解包这些值来访问元素:
s = set([1, 2, 3])
v1, v2, v3 = s
print(v1,v2,v3)
#1 2 3