我有一个像这样的字典:
exampleDict={'name': 'Example1', 'code': 2, 'price': 23, 'dimensions': [2,2]}
我想将dimensions
的类型更改为字符串,如下所示:
exampleDict['dimensions'] = str(dict['dimensions'])
这很好用。但是,想象一下我的exampleDict
里面有嵌套的dict,而dimensions
里面还有一点距离。
我的猜测是递归地做某事。根据我在此处搜索的内容(例如this one或this 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'])
它什么也不会做。我已经调试了它,它将只通过name
,nesting
和price
。 isinstance
不能正常工作(或者是,我还没有完全理解其方法论)。
答案 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'
已被转换为字符串,而其他所有内容均保持不变。