Как получить произвольный элемент из 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'