我有一个看起来像这样的Python字典
{'data': [{'data': [{'data': 'gen1', 'name': 'objectID'},
{'data': 'familyX', 'name': 'family'}],
'name': 'An-instance-of-A'},
{'data': [{'data': 'gen2', 'name': 'objectID'},
{'data': 'familyY', 'name': 'family'},
{'data': [{'data': [{'data': '21',
'name': 'objectID'},
{'data': 'name-for-21',
'name': 'name'},
{'data': 'no-name', 'name': None}],
'name': 'An-instance-of-X:'},
{'data': [{'data': '22',
'name': 'objectID'}],
'name': 'An-instance-of-X:'}],
'name': 'List-of-2-X-elements:'}],
'name': 'An-instance-of-A'}],
'name': 'main'}
该结构是重复的,其规则如下:
- 字典包含“名称”和“数据”
- “data”可以包含字典列表
- 如果“data”不是列表,那么它就是我需要的值。
- “name”只是一个名字
问题是对于每个值,我需要知道每个 parent 的所有信息。
所以最后,我需要打印一个包含如下项目的列表:
objectID=gen2 family=familyY An-instance-of-X_objectID=21 An-instance-of-X_name=name-for-21
编辑:这只是我想要作为输出的几行之一。对于每个没有字典作为“数据”的项目,我需要这样一行。
因此,对于每个不是字典的数据,向上遍历,查找信息并打印它..
我不知道 itertools 和 collections 等模块中的每个函数。但里面有什么东西我可以用吗?这叫什么(当我尝试自己做研究时)?
我可以找到很多“扁平化字典”方法,但不是这样的,当我有像这样的“数据”、“名称”时就不行了..
最佳答案
这是递归的一个很好的例子:
input_ = {'data': [{'data': [{'data': 'gen1', 'name': 'objectID'},
{'data': 'familyX', 'name': 'family'}],
'name': 'An-instance-of-A'},
{'data': [{'data': 'gen2', 'name': 'objectID'},
{'data': 'familyY', 'name': 'family'},
{'data': [{'data': [{'data': '21',
'name': 'objectID'},
{'data': 'name-for-21',
'name': 'name'},
{'data': 'no-name', 'name': None}],
'name': 'An-instance-of-X:'},
{'data': [{'data': '22',
'name': 'objectID'}],
'name': 'An-instance-of-X:'}],
'name': 'List-of-2-X-elements:'}],
'name': 'An-instance-of-A'}],
'name': 'main'}
def parse_dict(d, predecessors, output):
"""Recurse into dict and fill list of path-value-pairs"""
data = d["data"]
name = d["name"]
name = name.strip(":") if type(name) is str else name
if type(data) is list:
for d_ in data:
parse_dict(d_, predecessors + [name], output)
else:
output.append(("_".join(map(str,predecessors+[name])), data))
result = []
parse_dict(input_, [], result)
print "\n".join(map(lambda x: "%s=%s"%(x[0],x[1]),result))
输出:
main_An-instance-of-A_objectID=gen1
main_An-instance-of-A_family=familyX
main_An-instance-of-A_objectID=gen2
main_An-instance-of-A_family=familyY
main_An-instance-of-A_List-of-2-X-elements_An-instance-of-X_objectID=21
main_An-instance-of-A_List-of-2-X-elements_An-instance-of-X_name=name-for-21
main_An-instance-of-A_List-of-2-X-elements_An-instance-of-X_None=no-name
main_An-instance-of-A_List-of-2-X-elements_An-instance-of-X_objectID=22
我希望我正确理解了您的要求。如果您不想将路径连接到字符串中,则可以保留前趋列表。
问候,
托斯顿
关于python - 获取每个项目的 python dict.keys 轨迹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13970261/