Python中字典操作的别名

Cha*_*ong 8 python

我想做这样的事情:

f[frozenset((1,3,4))] = 5
f[frozenset((1,))] = 3
Run Code Online (Sandbox Code Playgroud)

但是一直输入这些内容真的很痛苦,无论如何都有别名吗?我知道在C++中有一个辅助函数可以返回一个引用,所以你只需键入:

F(1,3,4) = 5
F(1) = 3
Run Code Online (Sandbox Code Playgroud)

用F作为辅助函数.非常感谢!

mgi*_*son 13

我认为这实际上只能通过子类来实现:

class FrozenSetDict(dict):
    def __setitem__(self,idx,value):
        try:
            dict.__setitem__(self,frozenset(idx),value)
        except TypeError:
            dict.__setitem__(self,frozenset((idx,)),value)

d = FrozenSetDict()
d[1,2,3] = 4
d[1] = 5
print d
Run Code Online (Sandbox Code Playgroud)

收益率:

{frozenset([1, 2, 3]): 4, frozenset([1]): 5}
Run Code Online (Sandbox Code Playgroud)

这引入了之间的不对称性__getitem__,__setitem__并且可以通过__getitem__以相同的方式重新定义来容易地修复.

这可能看起来有点乱 - 事实确实如此.为什么需要子类?这使得将非frozenset对象作为键放入字典变得更加困难.您可以轻松地使用此配方来创建一个代理对象,它将使用您的dict执行此操作:

#I don't like the name of this class -- I'm open to suggestions :)
class FrozenSetProxy(object):
    def __init__(self,obj):
        self.obj = obj

    def __setitem__(self,idx,value):
        try:
            self.obj[frozenset(idx)] = value
        except TypeError:
            self.obj[frozenset((idx,))] = value

    def __getitem__(self,idx):
        try:
            return self.obj[frozenset(idx)]
        except TypeError:
            return self.obj[frozenset((idx,))]

d = dict()
F = FrozenSetProxy(d)
F[1,2,3] = 4
F[1] = 5
print d
print F[1]
Run Code Online (Sandbox Code Playgroud)