在python中使用frozenset作为一对

时间:2011-03-04 05:04:28

标签: python set immutability

我想制作一对两个元素。我不关心元素的顺序,所以我使用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 个答案:

答案 0 :(得分:16)

pair = frozenset([element1, element2])
elem1, elem2 = pair

答案 1 :(得分:9)

如果你有很多这样的配对,使用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)'
>>>

答案 2 :(得分:1)

如果它只是两个元素,则对它们进行解序。但是我不确定,你在这里尝试用冻结的

做什么
>>> s = frozenset([1,2])
>>> s
frozenset({1, 2})
>>> x,y = s
>>> x
1
>>> y
2

答案 3 :(得分:0)

仅需对上面的comment进行详细说明,并假设您的元素易于排序,就可以使用以下命令从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