在python中如何在没有循环的情况下从字典中提升键?

时间:2014-10-29 11:24:14

标签: python json dictionary

我有这样的字典:

{"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?

3 个答案:

答案 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'}]

但你必须决定循环是否真的那么丑:)。