Как получить произвольный элемент из frozenset?

Я хотел бы получить элемент из frozenset (конечно, не изменяя его, поскольку frozenset являются неизменяемыми). Лучшее решение, которое я нашел на данный момент:

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

который возвращает, как и ожидалось:

'a'

Другими словами, есть ли способ "вытолкнуть" элемент из frozenset, фактически не вытолкнув его?

Ответ 1

(Суммируя ответы, приведенные в комментариях)

Ваш метод так же хорош, как и любой, с оговоркой, что из 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']

Ответ 2

Если вы знаете, что в frozenset есть только один элемент, вы можете использовать итеративную распаковку:

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

Это несколько частный случай исходного вопроса, но он пригодится несколько раз.

Если у вас их много, это может быть быстрее следующего (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

Ответ 3

Вы можете использовать с python 3:

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