在嵌套字典中查找键以更改键的类型

时间:2019-04-01 15:40:56

标签: python dictionary

我有一个像这样的字典:

exampleDict={'name': 'Example1', 'code': 2, 'price': 23, 'dimensions': [2,2]}

我想将dimensions的类型更改为字符串,如下所示:

exampleDict['dimensions'] = str(dict['dimensions'])

这很好用。但是,想象一下我的exampleDict里面有嵌套的dict,而dimensions里面还有一点距离。

我的猜测是递归地做某事。根据我在此处搜索的内容(例如this onethis one之类的例子,他们在递归函数中使用yield,但我不确定为什么要使用它。

我正在考虑这样做:

def changeToStringDim(d):
    if 'dimensions' in d:
        d['dimensiones'] = str(d['dimensions'])
    for k in d:
        if isinstance(d[k], list):
            for i in d[k]:
                for j in changeToStringDim(i):
                    j[dimensions] = str(j['dimensions'])

我在这里找到了它,但是没有分配j[dimensions]=str(j['dimensions']),而是做了一个yield。但是我对此解决方案进行了修改,并且在类似此示例的字典中也可以正常工作。

现在,我正在尝试以嵌套的方式进行操作。

exDict2={'name': 'example1',
         'nesting': {'subnesting1': 'sub2',
                     'coordinates': [41.6769705, 2.288154]},
         'price': 123123132}
         }

具有相同功能,但将其更改为坐标:

def changeToStringCoord(d):
    if 'coordinates' in d:
        d['coordinates'] = str(d['coordinates'])
    for k in d:
        if isinstance(d[k], list):
            for i in d[k]:
                for j in changeToStringDim(i):
                    j['coordinates'] = str(j['coordinates'])

它什么也不会做。我已经调试了它,它将只通过namenestingpriceisinstance不能正常工作(或者是,我还没有完全理解其方法论)。

1 个答案:

答案 0 :(得分:1)

带注释的代码:

def changeNestedListToString(d):
    for k in d:

        # recursive call on dictionary type
        if isinstance(d[k], dict):
            changeNestedListToString(d[k])

        # convert lists to string
        elif isinstance(d[k], list):
            d[k] = str(d[k])

        # leave everything else untouched

测试数据:

example = {
    'name': 'example1',
    'nesting': {
        'subnesting1': 'sub2',
        'coordinates': [41.6769705, 2.288154]
    },
    'price': 123123132
}

调用函数后:

{
    'price': 123123132, 
    'name': 'example1', 
    'nesting': {
         'coordinates': '[41.6769705, 2.288154]', 
         'subnesting1': 'sub2'
    }
}

您会看到'coordinates'已被转换为字符串,而其他所有内容均保持不变。