在python中将frozenset作为一对使用

在python中将frozenset作为一对使用,python,set,immutability,Python,Set,Immutability,我想做一对两个元素。我不关心元素的顺序,所以我使用frozenset 我可以想到以下两种方法来迭代frozenset中的元素。难道没有更奇特的方法吗?提前谢谢 pair = frozenset([element1, element2]) pair2 = list(pair) elem1 = pair2[0] elem2 = pair2[1] 如果只是两个元素,则将它们按顺序排列。但我不确定,你在这里想用frozenset做什么 >>> s = frozenset([1,2])

我想做一对两个元素。我不关心元素的顺序,所以我使用
frozenset

我可以想到以下两种方法来迭代frozenset中的元素。难道没有更奇特的方法吗?提前谢谢

pair = frozenset([element1, element2])
pair2 = list(pair)
elem1 = pair2[0]
elem2 = pair2[1]

如果只是两个元素,则将它们按顺序排列。但我不确定,你在这里想用frozenset做什么

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

如果您有很多这样的配对功能,那么使用
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)'
>>>

为了详细说明以上内容,并假设您的元素很容易排序,您可以使用以下方法从
tuple
创建一个无序的pair类:

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

似乎您已经在使用
对元素对中的元素进行迭代。您还需要什么吗?
frozenset
当这对元素中的两个元素相同时,可能会产生混淆。这样就不会有一对了——我们将有一个由单个元素组成的冻结集,您的代码将与
索引器
中断。这一定是他的意思+1@kindall:+1我从来不知道有人能像这样打开电视机!旁注:提到元组可能同样有效,这可能不是不合理的……是的,我不确定他为什么不使用元组。但是解包可以处理任何序列——事实上,甚至是迭代器。Tuple保持信息的顺序,而set或frozenset不保持信息。(x,y)和(y,x)在我的问题上应该相等。是的,相等是一个很好的理由。我会把它放在我的魔术袋里。:-)由于元组是不可变的,您可以轻松地创建一个
元组
子类,该子类在
\uuuu init\uuuu()
方法中进行排序。很好的技巧。实际上,它必须在
\uuuu new\uuuuuu()
中,而不是
\uuuu init\uuuuuuuuuu()
(因为元组是不可变的,所以它们不会在
\uuuuuuu init\uuuuuuuuuuu()
中初始化)。只是试了一下;效果很好。看起来是个很好的把戏!但是,当把这个技巧应用到我的代码中时,程序的运行速度会慢一些。(我不知道为什么。我想为我的代码创建一个代码段并再次分析。我稍后会发布另一件事。)非常感谢!!只是好奇,我偶然发现了这个答案,并想知道为什么使用冻结套是个坏主意。只是因为它们占用了多少内存吗?哦,对了,明白了。因为最初的海报上说他不关心元素的顺序,我甚至没有想到可预测的顺序是一个特征。
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