如何更改字典中的键?
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
我有一本狗主人的字典,我需要编写一个函数 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