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

abl*_*din 13 python iterator set immutability

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

s = frozenset(['a'])
iter(s).next()
Run Code Online (Sandbox Code Playgroud)

按预期返回:

'a'
Run Code Online (Sandbox Code Playgroud)

换句话说,有没有任何方法可以从冻结集中"弹出"一个元素而不实际弹出它?

Zer*_*eus 11

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

您的方法与任何方法一样好,但需要注意的是,从Python 2.6开始,您应该使用next(iter(s))而不是iter(s).next().

如果您想要一个随机元素而不是任意元素,请使用以下内容:

import random
random.sample(s, 1)[0]
Run Code Online (Sandbox Code Playgroud)

以下是一些示例,展示了这两者之间的区别:

>>> s = frozenset("kapow")
>>> [next(iter(s)) for _ in range(10)]
['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']
Run Code Online (Sandbox Code Playgroud)
>>> import random
>>> [random.sample(s, 1)[0] for _ in range(10)]
['w', 'a', 'o', 'o', 'w', 'o', 'k', 'k', 'p', 'k']
Run Code Online (Sandbox Code Playgroud)

  • @rynemccall因为在Python 3中,[`iter.next()`不存在](https://www.python.org/dev/peps/pep-3114/). (4认同)

Dom*_*mpf 10

如果您知道冻结集中只有一个元素,则可以使用可迭代解包:

s = frozenset(['a'])
x, = s
Run Code Online (Sandbox Code Playgroud)

这有点是原始问题的一个特例,但它有时会派上用场.

如果你有很多这样的事情可能会比下一个更快(iter ..:

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • 如上所述,这仅适用于冻结集中的“恰好”一个元素。 (2认同)

tam*_*moj 5

您可以使用python 3:

>>> s = frozenset(['a', 'b', 'c', 'd'])
>>> x, *_ = s
>>> x
'a'
>>> _, x, *_ = s
>>> x
'b'
>>> *_, x, _ = s
>>> x
'c'
>>> *_, x = s
>>> x
'd'
Run Code Online (Sandbox Code Playgroud)