python – 为同一个字典值创建可交换元组键的最佳方法是什么?

def check():
    dict_choice_a = {(a, b) : value, (b, a) : value}  #(a, b) and (b, a) refer to the same value but repeted
    dict_choice_b = {tuple(sorted((a, b)) : value}  #not repetitive but unreadable
    dict_choice_a[(a, b)] = new_value #need to do twice to change value but more readable than dict_choice_b
    dict_choice_a[(b, a)] = new_value

    #value of both keys are always the same

我想创建一个字典,其中包含引用其值的元组键,键需要可以交换为(a,b)=(b,a),它们只引用相同的值.

这里的问题是:使郁金香元素的元素可以交换的最佳方法是什么,但也可以引用相同的值.

此外,字符串也应该在解决方案中工作.

解决方法:

根据评论,您可以将a和b放入frozenset,这是无序的:

dict_choice = {frozenset((a, b)): value}

如果你需要这是自动的,你可以创建自己的MutableMapping

class MyDict(MutableMapping):

    def __init__(self, arg=None):
        self._map = {}
        if arg is not None:
            self.update(arg)

    def __getitem__(self, key):
        return self._map[frozenset(key)]

    def __setitem__(self, key, value):
        self._map[frozenset(key)] = value

    def __delitem__(self, key):
        del self._map[frozenset(key)]

    def __iter__(self):
        return iter(self._map)

    def __len__(self):
        return len(self._map)

正在使用:

>>> d = MyDict([((1, 2), 'hello'), ((3, 4), 'world')])
>>> d[(2, 1)]
'hello' 

但请注意,这可能与其他类型的键有意外行为:

>>> d['hello'] = 'world'
>>> d['hole']
'world'
>>> d[1] = 2
Traceback (most recent call last):
  File "python", line 1, in <module>
  File "python", line 14, in __setitem__
TypeError: 'int' object is not iterable
上一篇:java – 用于元组列表的crudrepository findBy方法签名


下一篇:python – str.startswith如何真正起作用?