我有这样的字典:
{"father_id":"No.1", "a_have_list":[{"child_id":1},{"child_id":2}]}
我想要提取这个dict并提升这样的孩子id:
[{"child_id":1, "child_father_id":"No.1"}, {"child_id":2, "child_father_id":"No.1"}]
如果没有丑陋的循环,我怎么能做这个pythonic?
答案 0 :(得分:1)
不,你必须使用一个循环。您可以将该循环集成到列表解析中:
[dict(child, child_father_id=d['father_id']) for child in d['a_have_list']]
这将创建每个子词典的副本,并在您进行时添加father_id
键。
演示:
>>> d = {'father_id':"No.1", 'a_have_list':[{'child_id':1},{'child_id':2}]}
>>> [dict(child, father_id=d['father_id']) for child in d['a_have_list']]
[{'child_id': 1, 'father_id': 'No.1'}, {'child_id': 2, 'father_id': 'No.1'}]
答案 1 :(得分:1)
如果没有循环,你就不能这样做:你需要依次对每个元素进行操作,所以很明显这需要一个循环。列表理解会很好:
father_id = my_dict['father_id']
[{'child_id': inner_dict['child_id'], 'child_father_id': father_id} for inner_dict in my_dict['a_have_list']]
答案 2 :(得分:0)
我假设您不希望显式类型的循环(并且更喜欢一些看上去很奇怪的列表理解),并且实际输入是一个dicts列表而不是单个dict因为那更有可能。
即,示例输入如下:
[{'father_id': 'No.1', 'a_have_list': [{'child_id': 1}, {'child_id': 2}]},
{'father_id': 'No.2', 'a_have_list': [{'child_id': 3}]}]
然后,您可以组合两个列表推导以获得所需的结果:
[{'child_id': y['child_id'], 'child_father_id': x['father_id']}
for x in inp for y in x['a_have_list']]
结果是:
[{'child_id': 1, 'child_father_id': 'No.1'},
{'child_id': 2, 'child_father_id': 'No.1'},
{'child_id': 3, 'child_father_id': 'No.2'}]
但你必须决定循环是否真的那么丑:)。