Python 如何从冻结集获取任意元素?

Python 如何从冻结集获取任意元素?,python,iterator,set,immutability,Python,Iterator,Set,Immutability,我想从frozenset中获取一个元素(当然,不需要修改它,因为frozenset是不可变的)。到目前为止,我找到的最佳解决方案是: s = frozenset(['a']) iter(s).next() 正如预期的那样,它返回: 'a' 换句话说,是否有任何方法可以从冻结集中“弹出”元素而不实际弹出它?(总结评论中给出的答案) 您的方法与任何方法一样好,但需要注意的是,在Python2.6中,您应该使用next(iter(s))而不是iter(s).next() 如果需要随机元素而不是任意

我想从
frozenset
中获取一个元素(当然,不需要修改它,因为
frozenset
是不可变的)。到目前为止,我找到的最佳解决方案是:

s = frozenset(['a'])
iter(s).next()
正如预期的那样,它返回:

'a'
换句话说,是否有任何方法可以从
冻结集
中“弹出”元素而不实际弹出它?

(总结评论中给出的答案)

您的方法与任何方法一样好,但需要注意的是,在Python2.6中,您应该使用
next(iter(s))
而不是
iter(s).next()

如果需要随机元素而不是任意元素,请使用以下命令:

import random
random.sample(s, 1)[0]
以下是两个示例,说明了这两者之间的区别:

>>> s = frozenset("kapow")
>>> [next(iter(s)) for _ in range(10)]
['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']

如果您知道frozenset中只有一个元素,则可以使用iterable unpacking:

s = frozenset(['a'])
x, = s
这在某种程度上是原始问题的一个特例,但有时它会派上用场

如果你有很多这样的事情要做,它可能比下一个更快(国际热核聚变实验堆…:


您可以使用python 3:

>>> s = frozenset(['a', 'b', 'c', 'd'])
>>> x, *_ = s
>>> x
'a'
>>> _, x, *_ = s
>>> x
'b'
>>> *_, x, _ = s
>>> x
'c'
>>> *_, x = s
>>> x
'd'

使用
列表

list\=list(frozenset(“Benyamin”))

使用
生成器

def get_frozenset_元素(冻结集):
对于冻结集合中的i:
产量一
gen=获取frozenset元素(frozenset(“Benyamin”))
下一个(第二代)
下一个(第二代)
下一个(第二代)
...

使用
迭代器

国际热核实验堆 下一个(第二代) 下一个(第二代) 下一个(第二代) ...
[注意]:


我认为你的方法和任何方法一样好。如果你想要一个随机元素,你可以查看
random.sample(fset,1)
。为什么要弹出元素,因为它是任意的?我只想从冻结集中获取一些任意元素。我不应该使用pop这个词,因为集合保持不变。这类似于在不弹出的情况下偷看堆栈的第一个元素。这就是我使用的(但使用
下一个
内置而不是方法)。不要使用方法
.next()
。至少python2.6有一个
next()
内置函数,使用它意味着您的代码也将在python3中工作,在python3中
next
方法被重命名为
\uuuuuuuuuuuuuuu\uuuuuu
。为什么要调用
next(iter))
,而不是
iter。next()
?@rynemcall,因为在Python 3中,.
ValueError:在包含多个元素的集合上,值太多,无法解包。
。如上所述,这只适用于frozenset中的一个元素。第一种方法只是编写
列表(my_frozenset)的一种复杂方式
,这对于大型集合来说是相当浪费的。第二种方法只是编写
下一步(iter(my_frozenset))
,这已经是公认的答案。
>>> timeit.timeit('a,b = foo', setup='foo = frozenset(range(2))', number=100000000)
5.054765939712524
>>> timeit.timeit('a = next(iter(foo))', setup='foo = frozenset(range(2))', number=100000000)
11.258678197860718
>>> s = frozenset(['a', 'b', 'c', 'd'])
>>> x, *_ = s
>>> x
'a'
>>> _, x, *_ = s
>>> x
'b'
>>> *_, x, _ = s
>>> x
'c'
>>> *_, x = s
>>> x
'd'