【问题标题】:How to to change the keys in a dictionary?如何更改字典中的键?
【发布时间】:2021-02-01 16:15:16
【问题描述】:

我有一本狗主人字典,我需要编写一个函数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(),然后在键中添加一个新元组,但我不知道怎么做。

【问题讨论】:

  • 这能回答你的问题吗? Change the name of a key in dictionary
  • 您不能更改字典的键,您只能删除现有的键、值对并用新的替换它们——有几种方法可以做到这一点。这与元组不可变这一事实无关,因此您目前接受的答案在这方面是不正确的。

标签: python python-3.x dictionary tuples key


【解决方案1】:

您可以替换键来实现这一点,而且元组是不可变的。

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

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

【讨论】:

  • 元组的不变性与它无关(字符串也是可变的)。事实上所有的字典键都是不可变的。
  • 我的主要观点是,这个问题与键的不变性无关,因为你不能改变字典中值的键——所以即使指出它也是一种误导——相反,您必须始终删除现有的对并用另一个替换它们。
  • 这是一个改进,但您似乎仍然没有掌握这样一个事实,即作为元组的键与问题没有真正的关系(即,如果键是,它仍然存在,例如,字符串)。您的代码有效,因为它正在执行我之前提到的需要做的替换。
  • 我确实理解字典键是不可变的,我并不是说元组在这里造成了问题。我希望你已经看到了这个“你可以替换键来实现”。
  • 那为什么还要提呢?不妨加上“天是蓝的”……
【解决方案2】:

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

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

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

也许更好的主意是用您的 dict 换取数据框。

【讨论】:

    猜你喜欢
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 2022-07-12
    • 2011-05-23
    相关资源
    最近更新 更多