Используйте фрозенцет как пару в питоне - PullRequest
7 голосов
/ 04 марта 2011

Я хотел бы сделать пару из двух элементов. Мне не важен порядок элементов, поэтому я использую frozenset.

Я могу подумать о следующих двух методах, чтобы перебрать элементы обратно из заморозки. Разве нет более причудливого метода? Заранее спасибо.

pair = frozenset([element1, element2])
pair2 = list(pair)
elem1 = pair2[0]
elem2 = pair2[1]
pair = frozenset([element1, element2])
elems = []
for elem in pair:
    elems.append(elem)
elem1 = elems[0]
elem2 = elems[1]

Ответы [ 4 ]

16 голосов
/ 04 марта 2011
pair = frozenset([element1, element2])
elem1, elem2 = pair
9 голосов
/ 04 марта 2011

Если у вас много таких парных вещей, использование frozenset() НЕ является хорошей идеей.Вместо этого используйте кортежи.

>>> import sys
>>> fs1 = frozenset([42, 666])
>>> fs2 = frozenset([666, 42])
>>> fs1 == fs2
True
>>> t1 = tuple(sorted([42, 666]))
>>> t2 = tuple(sorted([666, 42]))
>>> t1 == t2
True
>>> sys.getsizeof(fs1)
116
>>> sys.getsizeof(t1)
36
>>>

Обновление Бонус: отсортированные кортежи имеют предсказуемую последовательность итераций:

>>> for thing in fs1, fs2, t1, t2: print [x for x in thing]
...
[42, 666]
[666, 42]
[42, 666]
[42, 666]
>>>

Обновление 2 ...и их repr () одинаковы:

>>> repr(fs1)
'frozenset([42, 666])'
>>> repr(fs2)
'frozenset([666, 42])' # possible source of confusion
>>> repr(t1)
'(42, 666)'
>>> repr(t2)
'(42, 666)'
>>>
1 голос
/ 04 марта 2011

Если это всего лишь два элемента, вы отменяете их последовательность.Но я не уверен, что вы пытаетесь сделать здесь с помощью Frozenset

>>> s = frozenset([1,2])
>>> s
frozenset({1, 2})
>>> x,y = s
>>> x
1
>>> y
2
0 голосов
/ 28 августа 2018

Просто для уточнения вышеприведенного комментария и, предполагая, что ваши элементы легко сортируются, вы можете создать класс неупорядоченной пары из tuple, используя:

class Pair(tuple):
    def __new__(cls, seq=()):
        assert len(seq) == 2
        return tuple.__new__(tuple, sorted(seq))

Тогда вы получите:

>>> Pair((0, 1))
(0, 1)

>>> Pair((1, 0))
(0, 1)

>>> Pair((0, 1)) == Pair((1, 0))
True
...