代码之家  ›  专栏  ›  技术社区  ›  Quanti Monati

如何更新嵌套字典中键的值?

  •  1
  • Quanti Monati  · 技术社区  · 6 年前
    items = [{'id': 1, 'language': 'English', 'name': 'Sarah', 'description': 'Blah blah'}, {'id': 2, 'language': 'English', 'name': 'Jessica', 'description': 'More blah'}]
    
    d = {}
    for item in items:
    
        language = item['language']
        id = item['id']
        name = item['name']
        description = item['description']
    
        d[language][id] = {'name': name, 'description': description}
    
    print(d)
    

    我期待看到输出:

    {'English': {1:{'name': 'Sarah', 'description': 'Blah blah'}, 2:{'name': 'Jessica', 'description': 'More blah'}}}
    

    但不幸的是我有钥匙错误

    回溯(最近一次呼叫的最后一次): d[language][id]='name':name,'description':description keyror:'english'

    那么,问题是如何在嵌套字典中更新/附加值?我做错什么了?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Patrick Artner    6 年前

    _´D_´不包含 d["English"] 你试图用它来创造 d[language][id] = {'name': name, 'description': description} -因此出现了错误。


    如果中间字典不存在,则不能“即时”创建它们-检查它们是否已经存在,如果不存在,则创建它们-或使用 dict.setdefault(key,default) 若要创建尚不存在的条目,请执行以下操作:

    items = [{'id': 1, 'language': 'English', 'name': 'Sarah', 'description': 'Blah blah'},
             {'id': 2, 'language': 'English', 'name': 'Jessica', 'description': 'More blah'}]
    
    d = {}
    for item in items:
    
        language = item['language']
        idd = item['id']
        name = item['name']
        description = item['description']
    
        d.setdefault(language,{})[idd] = {'name': name, 'description': description}
    
    print(d)
    

    输出:

    {'English': {1: {'name': 'Sarah', 'description': 'Blah blah'}, 
                 2: {'name': 'Jessica', 'description': 'More blah'}}}
    

    你可以使用 collections.defaultdict 如果遇到性能问题, setdefault -速度稍微慢一点。


    相关: Use cases for the 'setdefault' dict method

        2
  •  3
  •   charpank    6 年前

    d是一个最初为空的字典,因此当您试图将值赋给 d[language][id] .

    您可以按如下方式更改代码:

    for item in items:
    
        language = item['language']
        id = item['id']
        name = item['name']
        description = item['description']
    
        if not language in d:
            d[language] = {}
        d[language][id] = {'name': name, 'description': description}