当前位置:  开发笔记 > 编程语言 > 正文

递归替换字典中的字符

如何解决《递归替换字典中的字符》经验,为你挑选了2个好方法。

.给定任意嵌套字典的情况下,如何将所有点更改为下划线(在dict的键中)?

我尝试的是编写两个循环,但后来我将仅限于2级嵌套字典.

这个 ...

{
    "brown.muffins": 5,
    "green.pear": 4,
    "delicious.apples": {
        "green.apples": 2
    {
}

......应该成为:

{
    "brown_muffins": 5,
    "green_pear": 4,
    "delicious_apples": {
        "green_apples": 2
    {
}

有优雅的方式吗?



1> thefourtheye..:

你可以编写一个递归函数,就像这样

from collections.abc import Mapping
def rec_key_replace(obj):
    if isinstance(obj, Mapping):
        return {key.replace('.', '_'): rec_key_replace(val) for key, val in obj.items()}
    return obj

当你用你在问题中显示的字典调用它时,你将得到一个新的字典,键中的点用_s 替换

{'delicious_apples': {'green_apples': 2}, 'green_pear': 4, 'brown_muffins': 5}

说明

在这里,我们只检查当前对象是否是实例,dict如果是,则我们迭代字典,替换密钥并递归调用该函数.如果它实际上不是字典,则按原样返回.



2> TigerhawkT3..:

假设.只存在于键中,并且所有字典的内容都是原始文字,那么真正便宜的方法是使用str()repr()更换,然后ast.literal_eval()将其取回:

d ={
    "brown.muffins": 5,
    "green.pear": 4,
    "delicious_apples": {
        "green.apples": 2
    } # correct brace
}

结果:

>>> import ast
>>> ast.literal_eval(repr(d).replace('.','_'))
{'delicious_apples': {'green_apples': 2}, 'green_pear': 4, 'brown_muffins': 5}

如果字典.在键之外,我们可以通过使用正则表达式来'ke.y':更换,以查找字符串,并仅替换那些位:

>>> import re
>>> ast.literal_eval(re.sub(r"'(.*?)':", lambda x: x.group(0).replace('.','_'), repr(d)))
{'delicious_apples': {'green_apples': 2}, 'green_pear': 4, 'brown_muffins': 5}

如果您的字典非常复杂,使用'.'值和字典类字符串等,请使用真正的递归方法.就像我在开始时说的那样,这是便宜的方式.


不过,这也会取代价值观
@erip理想情况下,它也应该对未来的访问者有用,而不仅仅是OP的特定情况.尽管如此,非常有创意
推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有