【发布时间】:2023-03-11 09:51:01
【问题描述】:
所以我有这个字典:
di = {'Type': ['Something1'],
'details': [{'detail': [{'category': ['Stuff1'], 'value': ['Value1']},
{'category': ['Stuff2'], 'value': ['Value2']},
{'category': ['Stuff3'], 'value': ['Value3']},
{'category': ['Stuff3'], 'value': ['Value3']},
{'category': ['Stuff4'], 'value': ['Value4']}]}],
'timestamp': ['2018-01-22 07:10:41']}
并希望将任何list(除了其中不包含另一个list of dicts 的任何list of dicts 除外)转换为dict,这样最终结果将是:
{'Type': 'Something1',
'details': {'detail': [{'category': 'Stuff1', 'value': 'Value1'},
{'category': 'Stuff2', 'value': 'Value2'},
{'category': 'Stuff3', 'value': 'Value3'},
{'category': 'Stuff3', 'value': 'Value3'},
{'category': 'Stuff4', 'value': 'Value4'}]},
'timestamp': '2018-01-22 07:10:41'}
因此,本质上,对于值为单个项目list 的任何键,该值应删除list 组件。
我尝试了以下递归函数但没有成功:
def delistdict(dicto):
delisted = {}
for k,v in dicto.items():
if isinstance(v, list) and len(v) == 1:
delisted[k] = v[0]
else:
delisted[k] = delistdict(v)
return {k:v if len(v) == 1 else v for k,v in delisted.items()}
它失败了,因为它只删除了 {'detail': [(...)] 中 list 的第一个实例(所以只是那个外部 [(...)] 列表),但它不会递归到剩余物品。所以我运行脚本后的结果是这样的:
{'Type': 'Something1',
'details': {'detail': [{'category': ['Stuff1'], 'value': ['Value1']},
{'category': ['Stuff2'], 'value': ['Value2']},
{'category': ['Stuff3'], 'value': ['Value3']},
{'category': ['Stuff3'], 'value': ['Value3']},
{'category': ['Stuff4'], 'value': ['Value4']}]},
'timestamp': '2018-01-22 07:10:41'}
应该发生的情况是 value 和 category 键中的单个值应转换为 strings,而不是在 list 中保留为单个项目。
任何想法我做错了什么?
【问题讨论】:
-
如果一个值是一个字典,那么递归地应用你的函数。
标签: python list dictionary recursion