我想从一个frozenset中获取一个元素(当然不需要修改它,因为frozenset是不可变的)。到目前为止,我找到的最好的解决方案是:
s = frozenset(['a'])
iter(s).next()它会像预期的那样返回:
'a'换句话说,有没有办法从frozenset中“弹出”一个元素,而不是真正地弹出它?
发布于 2013-07-25 04:19:09
(总结评论中给出的答案)
您的方法和其他方法一样好,但需要注意的是,从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']>>> import random
>>> [random.sample(s, 1)[0] for _ in range(10)]
['w', 'a', 'o', 'o', 'w', 'o', 'k', 'k', 'p', 'k']发布于 2016-06-28 20:27:58
如果你知道在frozenset中只有一个元素,你可以使用iterable解包:
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发布于 2017-05-05 19:40:45
你可以在python 3中使用:
>>> s = frozenset(['a', 'b', 'c', 'd'])
>>> x, *_ = s
>>> x
'a'
>>> _, x, *_ = s
>>> x
'b'
>>> *_, x, _ = s
>>> x
'c'
>>> *_, x = s
>>> x
'd'https://stackoverflow.com/questions/17801665
复制相似问题