【问题标题】:Updating dictionaries without data loss更新字典而不丢失数据
【发布时间】:2014-09-15 16:38:22
【问题描述】:

如果我有两个如下所示的字典:

a = {"fruit":["orange", "lemon"], "vegetable":["carrot", "tomato"]}
b = {"fruit":["banana", "lime"]}

有没有一种方法可以更新字典“a”,这样我就不会覆盖以前的数据,而是简单地附加它,这样我的结果就会像这样?

a = {"fruit":["orange", "lemon", "banana", "lime"], "vegetable": ["carrot", "tomato"]}

我知道有类似的东西,但不幸的是它重写了值,这不是我想要做的:

a.update(b)
#returns a dictionary like the following {"fruit":["banana", "lime"], "vegetable":["carrot","tomato"]}, again, not what I want. 

【问题讨论】:

    标签: python python-3.x dictionary python-3.4


    【解决方案1】:

    没有循环就不行:

    for k, v in b.items():
        a[k].extend(v)
    

    这假定a[k] 确实存在。 . .如果你想在它丢失的情况下添加它:

    for k, v in b.items():
        try:
            a[k].extend(v)
        except KeyError:
            a[k] = v
    

    【讨论】:

    • 那是相当不幸的
    • @sudobangbang -- 代码真的不多 :-)
    • a.setdefault(k, []).extend(v)
    • @chepner -- 是的,甚至可以使用defaultdict
    • @sudobangbang 不要担心效率,除非您知道这是个问题。实施、分析然后优化瓶颈。
    【解决方案2】:

    您可以使用defaultdict,但您必须遍历这些项目。

    from collections import defaultdict
    a = defaultdict(list)
    

    你也可以定义一个辅助方法(但注意不要用普通的字典来调用它,一些类型检查可能是合适的):

    def update(a,b):
        for k, v in b.items():
            a[k].extend(v)
    

    另一种选择是扩展 dict 并覆盖 update 方法以在此处执行此操作。

    【讨论】:

      【解决方案3】:

      你也可以做一个简单的while循环:

      accesos = {'carlos pinto': 23849284}
      
      while True:
          nueva_persona = input("Nombre?: ")
          nueva_clave = input("Clave?: ")
      
          accesos[nueva_persona] = nueva_clave
          print(accesos)
      

      【讨论】:

        猜你喜欢
        • 2011-08-10
        • 2020-10-01
        • 1970-01-01
        • 2015-09-22
        • 2011-07-25
        • 1970-01-01
        • 1970-01-01
        • 2018-08-23
        • 1970-01-01
        相关资源
        最近更新 更多