【发布时间】:2014-09-16 01:58:44
【问题描述】:
我正在尝试将列表递归地转换为嵌套字典,如下所示:-
给定输入:-
parse_list = ['A','B','C','D']
所需输出:-
data = [
{'name': 'A',
'childs': [
{'name': 'B',
'childs': [
{'name': 'C',
'childs': [
{'name': 'D',
'childs': none }]}]}]}]
我的代码:-
from collections import defaultdict
class_dict =defaultdict(list)
data =defaultdict(list)
parse_list.reverse()
def create_dict(parse_list,class_dict):
for index ,listitem in enumerate(parse_list):
new_class_dict = defaultdict(list)
new_class_dict.__setitem__('name', listitem)
new_class_dict['childs'].append(class_dict)
class_dict = new_class_dict
return class_dict
data = create_dict(parse_list,class_dict)
import yaml
with open('data.yml', 'w') as outfile:
outfile.write( yaml.dump(data, default_flow_style=False))
但是由于 defaultdict(list),我总是在 yaml 中得到许多额外的缩进,这是意料之外的。有没有其他方法可以获取 [{....}] 而不是使用 collection.defaultdict。
【问题讨论】:
-
ARGH!!! 你为什么直接打电话给
__setitem__?!?此外,您的代码实际上并不需要defaultdict,因为您只需要并且始终创建一个密钥。 -
非常感谢@Bakuriu 的回复。这里我使用 setitem 因为下一个条目 ['childs'] 也是一个字典列表。它是最简单的模型,因为我需要将孩子用于不同级别的多个条目以进一步发展。有没有其他方法请建议。
-
我的意思是
new_class_dict.__setitem__('name', listitem)完全等同于new_class_dict['name'] = listitem。实际上它更慢,因为它需要额外的方法查找。如果你曾直接调用名称中带有双下划线的方法你做错了(有一些例外,但不适合初学者)。 -
感谢@Bakuriu,我从其他关于堆栈溢出的帖子中学到了这种风格。但是非常感谢这个解释。我会记住这一点。
标签: python recursion dictionary yaml