Use frozenset as a pair in python

后端 未结 4 604
轮回少年
轮回少年 2021-02-06 06:37

I would like to make a pair of two elements. I don\'t care about the order of the elements, so I use frozenset.

I can think of the following two methods t

相关标签:
4条回答
  • 2021-02-06 06:56

    If it is just two elements you are de-sequence them. But I am not sure, what you are trying to do here with the frozenset

    >>> s = frozenset([1,2])
    >>> s
    frozenset({1, 2})
    >>> x,y = s
    >>> x
    1
    >>> y
    2
    
    0 讨论(0)
  • 2021-02-06 07:03

    Just to elaborate on an above comment, and assuming your elements are easily sortable, you could make an unordered pair class from tuple using:

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

    Then you get:

    >>> Pair((0, 1))
    (0, 1)
    
    >>> Pair((1, 0))
    (0, 1)
    
    >>> Pair((0, 1)) == Pair((1, 0))
    True
    
    0 讨论(0)
  • 2021-02-06 07:12
    pair = frozenset([element1, element2])
    elem1, elem2 = pair
    
    0 讨论(0)
  • 2021-02-06 07:14

    If you have a lot of those pair things, using frozenset() is NOT a good idea. Use tuples instead.

    >>> 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
    >>>
    

    Update Bonus: sorted tuples have a predictable iteration sequence:

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

    Update 2 ... and their repr() is the same:

    >>> repr(fs1)
    'frozenset([42, 666])'
    >>> repr(fs2)
    'frozenset([666, 42])' # possible source of confusion
    >>> repr(t1)
    '(42, 666)'
    >>> repr(t2)
    '(42, 666)'
    >>>
    
    0 讨论(0)
提交回复
热议问题