【问题标题】:Python modify nested dictionary value at list of keysPython在键列表中修改嵌套字典值
【发布时间】:2019-07-18 03:13:54
【问题描述】:

我有一本像这样的字典:

{"value1": {}, "value2": {"value3": {}, "value4": {}, "value5": {"value6": {}}}}

还有一个键列表:

["value2", "value4"]

如何修改字典以将键 "value4"(在带有键 "value2" 的字典中)更改为 "value4*"?我只希望最后一个键受到影响,所以"value2" 不会被更改。

我尝试过使用list(map(dictionary.get, keys)),但这并没有达到我想要的效果。

提前致谢。

附言我尽量保持简短,如果我剪得太多,请告诉我。

【问题讨论】:

  • 是的,你剪得太多了。 “value4*”是什么意思?
  • @RafaelBarros 好的,我将尝试对其进行编辑以使其更清晰。谢谢
  • 您要更改value2value4 还是只更改value4
  • 这是您应该清楚说明的内容,因为列表表明您想要更改此列表中的所有键 - 我认为 - 也是 @Ajax1234 假设的。
  • @Cleb 我会编辑帖子。谢谢

标签: python dictionary multidimensional-array nested


【解决方案1】:

你可以使用递归:

new_d = ["value2", "value4"]
d = {"value1": {}, "value2": {"value3": {}, "value4": {}, "value5": {"value6": {}}}}
def update(data):
  return {a if a != new_d[-1] else f'{a}*':b if not isinstance(b, dict) else update(b) for a, b in data.items()}

print(update(d))   

输出:

{'value1': {}, 'value2': {'value3': {}, 'value4*': {}, 'value5': {'value6': {}}}}

编辑:没有f-string

def update(data):
  return {a if a != new_d[-1] else a+"*":b if not isinstance(b, dict) else update(b) for a, b in data.items()}

【讨论】:

  • 嗯...它在return 之后的第一个单引号处给了我无效的语法。我正在使用py3顺便说一句。任何想法是什么原因造成的?
  • @Jachdich 这是因为第一个解决方案是使用f-string 来格式化新密钥,这仅在Python3.7 中可用。请查看我最近的编辑。
  • 谢谢,现在可以使用了。只有一件事,是否可以只更新最后一个键?所以只有value4 改变而不是value2
  • @Jachdich 很高兴为您提供帮助!
【解决方案2】:

其他选项,但逻辑不同。

适用于二级键,它仅更改直接在value2 下的value4

dct = {"value1": {}, "value2": {"value3": {}, "value4": {}, "value5": {"value4": {}}}}
keyz = ["value2", "value4"]

print(dct)

def append_star(dct, keyz):
  dct[keyz[0]][keyz[1] + '*'] = dct[keyz[0]][keyz[1]]
  del dct[keyz[0]][keyz[1]]

append_star(dct, keyz)

或者在这种情况下,value2 直接在value2 之下,而不是更高级别的value2

dct = {"value1": {}, "value2": {"value2": {}, "value4": {}, "value5": {"value4": {}}}}
keyz = ["value2", "value2"]
{'value1': {}, 'value2': {'value4': {}, 'value5': {'value4': {}}, 'value2*': {}}}

【讨论】:

    猜你喜欢
    • 2018-07-10
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多