当前位置: 首页 > 面试题库 >

递归访问字典和修改

盖玉石
2023-03-14
问题内容

我有以下字典:

my_dict = {'key1': {'key2': {'foo': 'bar'} } }

我想将一个条目附加到key1-> key2-> key3上,其值为’blah’,产生:

my_dict = {'key1': {'key2': {'foo': 'bar', 'key3': 'blah'} } }

我正在寻找一种与键的数量无关的通用解决方案,即即使不存在从key3向下的键,key1-> key2-> key3-> key4->
key5也应该起作用。这样我得到:

my_dict = {'key1': {'key2': {'foo': 'bar', 'key3': {'key4': {'key5': 'blah'} } } } }

提前致谢。


问题答案:

您可以使用该reduce()函数遍历一系列嵌套字典:

def get_nested(d, path):
    return reduce(dict.__getitem__, path, d)

演示:

>>> def get_nested(d, path):
...     return reduce(dict.__getitem__, path, d)
... 
>>> my_dict = {'key1': {'key2': {'foo': 'bar', 'key3': {'key4': {'key5': 'blah'}}}}}
>>> get_nested(my_dict, ('key1', 'key2', 'key3', 'key4', 'key5'))
'blah'

当密钥不存在时,此版本引发异常:

>>> get_nested(my_dict, ('key1', 'nonesuch'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in get_nested
KeyError: 'nonesuch'

但您可以替换dict.__getitem__lambda d, k: d.setdefault(k, {}),使其创建空字典:

def get_nested_default(d, path):
    return reduce(lambda d, k: d.setdefault(k, {}), path, d)

演示:

>>> def get_nested_default(d, path):
...     return reduce(lambda d, k: d.setdefault(k, {}), path, d)
... 
>>> get_nested_default(my_dict, ('key1', 'nonesuch'))
{}
>>> my_dict
{'key1': {'key2': {'key3': {'key4': {'key5': 'blah'}}, 'foo': 'bar'}, 'nonesuch': {}}}

要在给定路径上 设置 值,请遍历除最后一个键以外的所有键,然后在常规词典分配中使用最后一个键:

def set_nested(d, path, value):
    get_nested_default(d, path[:-1])[path[-1]] = value

这使用该get_nested_default()函数根据需要添加空字典:

>>> def set_nested(d, path, value):
...     get_nested_default(d, path[:-1])[path[-1]] = value
... 
>>> my_dict = {'key1': {'key2': {'foo': 'bar'}}}
>>> set_nested(my_dict, ('key1', 'key2', 'key3', 'key4', 'key5'), 'blah')
>>> my_dict
{'key1': {'key2': {'key3': {'key4': {'key5': 'blah'}}, 'foo': 'bar'}}}


 类似资料:
  • 问题内容: G’day, 我试图找到拖网字典的函数的递归深度,但我有点迷路了……目前,我有类似以下内容: 我想知道嵌套最多的字典是如何嵌套的…所以我要做以下… 唯一的问题是,递归循环仅返回最终值(0)的返回值。如果我输入一条打印语句, 那么我至少可以打印出最高的递归值,但是返回值是另一回事… 我敢肯定,这很简单-我刚买了果冻脑。 干杯 问题答案: 确保将递归调用的结果分配给 depth 。此外,正

  • 如何在Swift中到达以下字典中的第二个整数(键)?而且,当我这样做的时候,我怎样才能找到第二个字典里的字串呢? 我尝试编写(例如)var test:Int=activeCustomers[1][1],但这不起作用。它说字典里没有一个叫下标的成员。

  • 问题内容: 因此,我有一个python字典,将其称为,然后在稍后的某个时间将该字典的版本称为。我想找到和之间的所有更改。换句话说,添加,删除或更改的所有内容。棘手的是,值可以是整数,字符串,列表或字典,因此需要递归。这是我到目前为止所拥有的: 除非该值是一个列表,否则它将正常工作。我无法提出一种优雅的方式来处理列表,而又没有在此函数之后重复重复使用该函数的巨大变化。 有什么想法吗? 编辑:这与这篇

  • Swift 5.x Set 访问和修改 1.遍历 Set 可以使用for-in遍历Set 因为Set是无序的, 如果要顺序遍历Set, 使用sorted()方法 let courses: Set = ["Math", "English", "History"] for course in courses { print(course) } print("--- 分割线 ---") for

  • 本文向大家介绍Java递归算法经典实例(经典兔子问题),包括了Java递归算法经典实例(经典兔子问题)的使用技巧和注意事项,需要的朋友参考一下 题目:古典问题:3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 分析:首先我们要明白题目的意思指的是每个月的兔子总对数;假设将兔子分为小中大三种,兔子从出生后三个月后每个月就会生出一对兔子,

  • 问题内容: 我正在尝试将数据从简单的对象图转换为字典。我不需要类型信息或方法,也不需要能够再次将其转换回对象。 我发现了有关从对象的字段创建字典的问题,但它不是递归执行的。 对于python来说相对较新,我担心我的解决方案可能很丑陋,或者是非Python的,或者以某种晦涩的方式破坏了,或者仅仅是普通的NIH。 我的第一次尝试似乎一直有效,直到我使用列表和字典对其进行尝试为止,并且似乎更容易的是仅检