向现有字典中添加新别名?

6

我想要将一个新的“名称”作为别名添加到字典中现有的键。

例如:

dic = {"duck": "yellow"}

userInput = raw_input("Type the *name* and *newname* (alias) here:")

#Somecode that allows me to input newname as an alias to "duck"

用户输入两个单词:name 以引用“duck”,newname 作为指向现有键的新键的值。即别名。 因此,当我更改"duck"的值时,"newname"也应该更改,反之亦然。 我尝试了很多方法,但无法找到一个好的方法来做到这一点。

为什么要让用户输入任意名称,然后将该名称用作变量? - Chen A.
用户应该输入名称,因为:“名称”是“新名称”应该作为别名指向的内容。因此,用户可能会输入:duck plastic。现在,plastic 也应该引用值“yellow”。 - Alvarsson
所以 name 是现有的键,而 newname 是要插入到字典中并指向相同值的新键,对吗? - Chen A.
那是正确的,@Vinny。 - Alvarsson
1个回答

11

这个功能没有内置的实现,但是在dict类型的基础上很容易构建:

class AliasDict(dict):
    def __init__(self, *args, **kwargs):
        dict.__init__(self, *args, **kwargs)
        self.aliases = {}

    def __getitem__(self, key):
        return dict.__getitem__(self, self.aliases.get(key, key))

    def __setitem__(self, key, value):
        return dict.__setitem__(self, self.aliases.get(key, key), value)

    def add_alias(self, key, alias):
        self.aliases[alias] = key


dic = AliasDict({"duck": "yellow"})
dic.add_alias("duck", "monkey")
print(dic["monkey"])    # prints "yellow"
dic["monkey"] = "ultraviolet"
print(dic["duck"])      # prints "ultraviolet"

aliases.get(key, key) 如果没有别名与之对应,将返回不变的 key

删除键和别名的处理留给读者作为练习。


2
这看起来很优雅;使用别名字典来代替原始键是这个问题的一个很好的解决方案。 - Chen A.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接