代码之家  ›  专栏  ›  技术社区  ›  sudeep Krishnan

将字典的元组转换为嵌套字典

  •  2
  • sudeep Krishnan  · 技术社区  · 7 年前

    我的代码有问题

    s1 = ({'server_id':'myserver1','cloud':'google','time':'1hr'},
          {'server_id':'myserver2','cloud':'aws','time':'2hr'},
          {'server_id':'myserver3','cloud':'google','time':'1hr'}
          {'server_id':'myserver4','cloud':'aws','time':'3hr'})
    mydict = {'mine':
              {data[i]:
               {key:value for key,value in data.iteritems() if key!='cloud'}
              for data in s1 for i in data if i=='cloud'}}
    print mydict
    

    结果:

    {'mine': {'aws': {'server_id': 'myserver3','time':'3hr'}}}
    

    但我期待这样的结果

    {'mine':
     {'aws':
      {'server_id': 'myserver1','time':'1hr'},
      {'server_id': 'myserver3','time':'3hr'}},
     {
     'google':
      {'server_id': 'myserver2','time':'2hr'},
      {'server_id': 'myserver4','time':'4hr'}}}
    

    有人能帮我吗?

    2 回复  |  直到 7 年前
        1
  •  4
  •   cs95 abhishek58g    7 年前

    考虑初始化字典并将其附加到循环中。使用 dict.pop 负责清除 cloud 键,而不必像当前这样迭代整个过程。

    from collections import defaultdict
    d = defaultdict(list)  # {}
    
    for s in s1:
        d[s.pop('cloud')].append(s)  # d.setdefault(s.pop('cloud'), []).append(s)
    
    {'mine' : dict(d)}
    

    {'mine': {'aws': [{'server_id': 'myserver1', 'time': '1hr'},
       {'server_id': 'myserver2', 'time': '2hr'},
       {'server_id': 'myserver3', 'time': '3hr'}]}}
    

    免责声明 这将修改 s1 到位(在 pop 变异子ct,如果该键存在,则返回该键的值。

    要处理键错误,您可以提供适当的默认值- s.pop('cloud', 'default') 哪里 default 是当 密钥不存在。

        2
  •  1
  •   akshat    7 年前

    问题是您试图将三个词典映射到同一个键。如果你把它变成一个字典列表,它就会起作用。

    s1 = ({'server_id':'myserver1','cloud':'aws','time':'1hr'},
          {'server_id':'myserver2','cloud':'aws','time':'2hr'},
          {'server_id':'myserver3','cloud':'aws','time':'3hr'})
    mydict = {'mine':
              {data['cloud']:
               [{key:value for key, value in data.iteritems() if key != "cloud"}
                for data in s1]}}
    print mydict
    

    输出:

    {'mine': {'aws': [{'server_id': 'myserver1', 'time': '1hr'},
       {'server_id': 'myserver2', 'time': '2hr'},
       {'server_id': 'myserver3', 'time': '3hr'}]}}