如何更改字典中的键?

How to to change the keys in a dictionary?

我有一本狗主人的字典,我需要编写一个函数 update_age() 来更新字典中狗主人的年龄。这是一个例子:

dog_owners = {("John", "Malkovic", 22): ["Fido"],
              ("Jake", "Smirnoff", 18): ["Butch"],
              ("Simon", "Ng", 32): ["Zooma", "Rocky"],
              ("Martha", "Black", 73): ["Chase"]}

所以关键是一个元组,其中数字 22、18、32 和 73 代表年龄。 函数 update_age() 有 3 个参数:字典名称、具有 3 个元素的元组、应该从元组更改数字的数字。

示例:

update_age(dog_owners, ("Jake", "Smirnoff", 18), 22)
dog_owners[("Jake", "Smirnoff", 22)] == ['Butch']
dog_owners.get(("Jake", "Smirnoff", 18)) is None

我试过:

def update_age(owners, owner, new_age):
    b = (new_age,)
    return owner[0:2] + b

但这是不正确的,因为原始密钥仍然具有以前的值,如果我写:

print(update_age(dog_owners, ("Jake", "Smirnoff", 18), 22))   # for check
print(dog_owners.get(("Jake", "Smirnoff", 18)) is None)

答案会是

('Jake', 'Smirnoff', 22)
False

所以这意味着我原来的密钥仍然有它以前的值。我该如何改变它?可能我应该尝试 pop() 而不是向密钥添加一个新元组,但我不知道如何。

字典键就是:键。您不能“更新”密钥;这是决定性的价值。您必须删除原来的并用新的替换它;这两个对象不相关。

但是,这里的问题似乎是设计问题之一:出于您尚未解释的原因,您将要更改的信息存储为密钥的一部分。相反,将该信息作为条目值的一部分:

          ("Simon Ng"): 
              {age: 32,
               dogs: ["Zooma", "Rocky"]},

也许一个更好的主意是用你的字典换一个数据框。

您可以替换键来实现此目的,而且元组是不可变的。

您还可以重构代码和重构字典,使此用例以更简单的方式实现,但以防万一,如果您想要它的方式,那么您可以查看下面的工作代码段。

def update_age(owners, owner, new_age):
    if owner in owners:   # check if owner tuple exist in dictionary keys
        owner_list = list(owner)   # convert to list since tuples are immutable
        owner_list.pop(-1)   # remove last value
        owner_list.append(new_age)  # add new age at last

        owners.update({tuple(owner_list): owners.get(owner)})  # add new key updated tuple
        owners.pop(owner)  # remove old key
    return owners


dog_owners = {("John", "Malkovic", 22): ["Fido"],
              ("Jake", "Smirnoff", 18): ["Butch"],
              ("Simon", "Ng", 32): ["Zooma", "Rocky"],
              ("Martha", "Black", 73): ["Chase"]
              }

print(update_age(dog_owners, ("Jake", "Smirnoff", 18), 22))

输出:

{('John', 'Malkovic', 22): ['Fido'], ('Simon', 'Ng', 32): ['Zooma', 'Rocky'], ('Martha', 'Black', 73): ['Chase'], ('Jake', 'Smirnoff', 22): ['Butch']}

元组是不可变的结帐why