首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析和创建嵌套字典

解析和创建嵌套字典
EN

Stack Overflow用户
提问于 2019-08-10 21:58:26
回答 2查看 273关注 0票数 2

我想创建一个字典,其中包含一个嵌套的字典结构,如下所示:

代码语言:javascript
复制
{
  "Jaque": {
    "ES": {
      "Madrid": [
        {
          "experience": 9
        }
      ]
    },
    "FR": {
      "Lyon": [
        {
          "experience": 11.4
        }
      ],
      "Paris": [
        {
          "experience": 20
        }
      ]
    }
  },
  "James": {
    "UK": {
      "London": [
        {
          "experience": 10.9
        }
      ]
    }
  },
  "Henry": {
    "UK": {
      "London": [
        {
          "experience": 15
        }
      ]
    }
  },
  "Joe": {
    "US": {
      "Boston": [
        {
          "experience": 100
        }
      ]
    }
  }
}
}

我的输入是这种格式的字典列表:

代码语言:javascript
复制
c = [{
    "country": "US",
    "city": "Boston",
    "name": "Joe",
    "experience": 100
  },
  {
    "country": "FR",
    "city": "Paris",
    "name": "Jaque",
    "experience": 20
  },
  {
    "country": "FR",
    "city": "Lyon",
    "name": "Jaque",
    "experience": 11.4
  },
  {
    "country": "ES",
    "city": "Madrid",
    "name": "Jaque",
    "experience": 9
  },
  {
    "country": "UK",
    "city": "London",
    "name": "Henry",
    "experience": 15
  },
  {
    "country": "UK",
    "city": "London",
    "name": "James",
    "experience": 10.9
  }
]

我的第一种方法是逐步创建嵌套的dict:

代码语言:javascript
复制
dd = dict.fromkeys([i.get("name") for i in c],defaultdict(dict))

#will create
# dd = {'Joe': defaultdict(<class 'dict'>, {}), 'Jaque': defaultdict(<class 'dict'>, {}), 'James': defaultdict(<class 'dict'>, {}), 'Henry': defaultdict(<class 'dict'>, {})}

for i in dd:
     for j in c:
         #verify if name from d is in dict j 
         if i in j.values():
             dd[i]=dict(zip([a.get("country") for a in c if i in a.values() ],[b.get("city") for b in c if i in b.values() ]))

# dd will become 
#{'Joe': {'US': 'Boston'}, 'Jaque': {'FR': 'Lyon', 'ES': 'Madrid'}, 'Henry': {'UK': 'London'}, 'James': {'UK': 'London'}}

现在,我想不出一种创建/更新dict嵌套结构的方法。是否有更动态的方法来创建dict?Thx

EN

Stack Overflow用户

回答已采纳

发布于 2019-08-10 22:18:42

您可以使用itertools.groupby组织列表,类似于预期的输出,然后循环转换为dict。

代码语言:javascript
复制
from itertools import groupby
from operator import itemgetter

data = [{"country": "US", "city": "Boston", "name": "Joe", "experience": 100 }, {"country": "FR", "city": "Paris", "name": "Jaque", "experience": 20 }, {"country": "FR", "city": "Lyon", "name": "Jaque", "experience": 11.4 }, {"country": "ES", "city": "Madrid", "name": "Jaque", "experience": 9 }, {"country": "UK", "city": "London", "name": "Henry", "experience": 15 }, {"country": "UK", "city": "London", "name": "James", "experience": 10.9 } ]

result = {}
for key, values in groupby(sorted(data, key=itemgetter('name')), key=itemgetter('name')):
    result[key] = {
        v['country']: {v['city']: [{'experience': v['experience']}]} for v in values
        }

print(result)
# {'Henry': {'UK': {'London': [{'experience': 15}]}}, 'James': {'UK': {'London': [{'experience': 10.9}]}}, 'Jaque': {'FR': {'Lyon': [{'experience': 11.4}]}, 'ES': {'Madrid': [{'experience': 9}]}}, 'Joe': {'US': {'Boston': [{'experience': 100}]}}}
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57445959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档