22

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

s = frozenset(['a'])
iter(s).next()

正如预期的那样返回:

'a'

换句话说,有没有办法从 a 中“弹出”一个元素frozenset而不实际弹出它?

4

4 回答 4

17

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

您的方法与任何方法一样好,但需要注意的是,从 Python 2.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']
>>> import random
>>> [random.sample(s, 1)[0] for _ in range(10)]
['w', 'a', 'o', 'o', 'w', 'o', 'k', 'k', 'p', 'k']
于 2013-07-24T20:19:08.807 回答
16

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

s = frozenset(['a'])
x, = s

这在某种程度上是原始问题的特例,但有时会派上用场。

如果你有很多这些事情要做,它可能比 next(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
于 2016-06-28T12:27:58.003 回答
10

您可以与 python 3 一起使用:

>>> s = frozenset(['a', 'b', 'c', 'd'])
>>> x, *_ = s
>>> x
'a'
>>> _, x, *_ = s
>>> x
'b'
>>> *_, x, _ = s
>>> x
'c'
>>> *_, x = s
>>> x
'd'
于 2017-05-05T11:40:44.877 回答
0

使用list

list_ = list(frozenset("Benyamin"))

使用generator

def get_frozenset_elements(frozen_set):
    for i in frozen_set:
        yield i

gen_ = get_frozenset_elements(frozenset("Benyamin"))
next(gen_)
next(gen_)
next(gen_)
...

使用iterator

iter_ = iter(frozenset("Benyamin"))
next(gen_)
next(gen_)
next(gen_)
...

[注意]:

Python 的生成器和迭代器的区别

于 2019-11-21T11:49:52.527 回答