Python将字典部分复制到新字典中

时间:2016-09-07 18:05:51

标签: python dictionary

我有一个python字典,如下所示:

old_dict={"payment_amt": "20",
          "chk_nr": "321749",
          "clm_list": {"dtl": [{"clm_id": "1A2345", "name": "John"},
                               {"clm_id": "9999", "name": "Jack"}]}}

我需要解析上面的内容并将其存储为:

{"payment_amt": "20",
 "clm_list": {"dtl": [{"clm_id": "1A2345"},
                      {"clm_id": "9999"}]}}

有没有正确的pythonic方法呢?

由于

3 个答案:

答案 0 :(得分:2)

是的,有许多“正确的pythonic方式”。 这是一种这样的方式:

old_dict = {
    "payment_amt": "20",
    "chk_nr": "321749",
    "clm_list": {
        "dtl": [
            {"clm_id": "1A2345", "name": "John"},
            {"clm_id": "9999", "name": "Jack"}]}}

new_dict = {
    'payment_amt': old_dict['payment_amt'],
    'clm_list': {
        'dtl': [{
            'clm_id': dtl['clm_id']} for dtl in old_dict['clm_list']['dtl']]}}

assert new_dict == {
    "payment_amt": "20",
    "clm_list": {"dtl": [{"clm_id": "1A2345"}, {"clm_id": "9999"}]}}

答案 1 :(得分:2)

就个人而言,如果输入总是与您列出的完全相同,我会在您发布的示例中使用您想要保留的确切键的简单副本(请参阅Rob的答案)。保持简单。

但是,如果您不能依赖输入始终具有相同的确切结构,您仍然可以将其减少为仅包含具有使用dict理解的递归函数的预期键。

old_dict = {"payment_amt": "20", 
            "chk_nr": "321749", 
            "clm_list": {"dtl": [{"clm_id": "1A2345", "name": "John"}, 
                                 {"clm_id": "9999", "name": "Jack"}]}}

keep = ["payment_amt", "clm_list", "dtl", "clm_id"]

def recursively_prune_dict_keys(obj, keep):
    if isinstance(obj, dict):
        return {k: recursively_prune_dict_keys(v, keep) for k, v in obj.items() if k in keep}
    elif isinstance(obj, list):
        return [recursively_prune_dict_keys(item, keep) for item in obj]
    else:
        return obj

new_dict = recursively_prune_dict_keys(old_dict, keep)
print new_dict

输出:

{'clm_list': {'dtl': [{'clm_id': '1A2345'}, {'clm_id': '9999'}]}, 'payment_amt': '20'}

答案 2 :(得分:1)

你可以创建一个“模板”字典/ list / whatever并定义一个递归方法,该方法遍历输入对象(某种嵌套列表/字典事物)和模板并行,并保留那些元素。模板中的相应位置。在基本版本中,这可能看起来像这样(但肯定可以扩展到涵盖更多情况):

  <div ng-repeat="car in cars | orderBy:'make + model'">

这里,假设def prune_dict(obj, template): if template is None: return obj if isinstance(template, dict): return {key: prune_dict(obj[key], template[key]) for key in template} if isinstance(template, list): return [prune_dict(x, template[0]) for x in obj] 是另一个字典或列表。 template用于表示结构中的“叶子”。对于None,假定模板仅包含一个元素,该元素用作所有列表元素的模板。对于list,它将保留模板中表示的所有值。

适用于您的用例:

dict