python:替换嵌套字典中的字符串

die*_*gus 3 python dictionary

我有一个嵌套字典,我想用它们的名称(即和 )替换列表中所有有空格后跟数字( 和)vlc 2.2的字符串。这是输入字典:ado 3.4ultr 3.1vlcadoultr

input = {'cl1': {'to_do': ['ab',
'dir8',
'cop',
'vlc 2.2.2.0',
'7zi',
'7zi',
'ado 3.4']},
'cl2': {'to_do': ['ultr 3.1', 'ab']}}
Run Code Online (Sandbox Code Playgroud)

这应该是输出:

result = {'cl1': {'to_do': ['ab',
'dir8',
'cop',
'vlc',
'7zi',
'7zi',
'ado']},
'cl2': {'to_do': ['ultr', 'ab']}}
Run Code Online (Sandbox Code Playgroud)

我正在尝试类似的事情:

for k in input:
    for e in input[k]['to_do']:
        input[k]['to_do'] = e.replace(e, e.split()[0])
Run Code Online (Sandbox Code Playgroud)

得到错误的输出:

{'cl1': {'to_do': 'ado'}, 'cl2': {'to_do': 'ab'}}
Run Code Online (Sandbox Code Playgroud)

我完全不明白错误在哪里。有什么帮助吗?谢谢

小智 5

一种更通用的方法是创建一个递归方法,再次调用自身:

def recursive_split(input, search):
    # check whether it's a dict, list, tuple, or scalar
    if isinstance(input, dict):
        items = input.items()
    elif isinstance(input, (list, tuple)):
        items = enumerate(input)
    else:
        # just a value, split and return
        return str(input).split(search)[0]

    # now call ourself for every value and replace in the input
    for key, value in items:
        input[key] = recursive_split(value, search)
    return input
Run Code Online (Sandbox Code Playgroud)

请注意,此方法使用就地替换,但可以轻松转换为返回新字典。这应该涵盖包含可以转换为字符串的任何类型值的任何结构。在你的情况下,你可以通过简单地调用它来使用它:

d = recursive_split(d, " ")
Run Code Online (Sandbox Code Playgroud)