【问题标题】:Python Joining two dictionnary with similar contentPython加入两个内容相似的字典
【发布时间】:2012-12-13 05:32:58
【问题描述】:

我正在寻找一种 Pythonic 方式(尽可能少的代码)来合并两个字典的内容:

basket1 = {"ham":2,"eggs":3}
basket2 = {"eggs":4,"spam":1}

我想得到第三个篮子,它将是其他两个篮子的“总和”,篮子 3 应该是:

basket3 --> {"ham":2,"eggs":7,"spam":1}

如果可能,请使用 set

【问题讨论】:

    标签: python dictionary set


    【解决方案1】:

    我会使用Counter,这是一种defaultdict,具有一些不错的属性:

    >>> from collections import Counter
    >>> basket1 = {"ham":2,"eggs":3}
    >>> basket2 = {"eggs":4,"spam":1}
    >>> basket_sum = Counter(basket1) + Counter(basket2)
    >>> basket_sum
    Counter({'eggs': 7, 'ham': 2, 'spam': 1})
    

    如果需要,您可以将其转换回纯 dict

    >>> dict(basket_sum)
    {'eggs': 7, 'ham': 2, 'spam': 1}
    

    【讨论】:

    • +1,打败我。另外,常用链接to the reference
    • 计数器的有趣使用
    • @Speccy:不直接。但是,如果您编写一个辅助函数来将Food 实例列表转换为字典,例如def basket_to_dict(basket): return {f.name: f.quantity for f in basket},那么像[Food(n,q) for n,q in (Counter(basket_to_dict(b1)) + Counter(basket_to_dict(b2))).iteritems()] 这样的东西应该可以工作。 (Python >= 2.7。)
    【解决方案2】:

    由于您要计算值,请使用collections.Counter

    basket3 = collections.Counter(basket1)
    basket3.update(basket2)
    

    或者:

    basket3 = collections.Counter(basket1) + collections.Counter(basket2)
    

    【讨论】:

    • @Speccy:查看新版本。
    • +1 用于显示update 方法。知道update 对于Counter 类型字典的行为不同是很有用的。
    • 谢谢,我会选择最受好评的答案,这与你的基本相同
    • @Speccy:对于未来的搜索者来说,它可能比我的更好,因为它显示了更多的细节,所以它是正确的接受。
    • @abarnert,如果我有一个 Food 类的实例列表(带有属性名称和数量)并且我想删除重复项并更新每个实例的总数量,这样的工作是否可行列表中 Food 类的唯一实例?
    【解决方案3】:
    In [2]: basket1 = {"ham":2,"eggs":3}
    
    In [3]: basket2 = {"eggs":4,"spam":1}
    
    In [4]: baskets = [basket1, basket2]
    
    In [5]: answer = collections.defaultdict(int)
    
    In [6]: for basket in baskets:
       ...:     for item in basket:
       ...:         answer[item] += basket[item]
       ...:         
    
    In [7]: answer
    Out[7]: defaultdict(<type 'int'>, {'eggs': 7, 'ham': 2, 'spam': 1})
    
    In [8]: dict(answer)
    Out[8]: {'eggs': 7, 'ham': 2, 'spam': 1}
    

    【讨论】:

    • 需要的是各个字典中重复键的值的总和,而不是包含该特定键的字典数。
    • 我认为这可以通过将answer[item] += 1 更改为answer[item] += basket[item] 来修复。
    • 这就是我的本意。固定!
    • 等等,你怎么能得到eggs of 9?
    • @DSM:这是之前试验中泄露的answer。查看更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    相关资源
    最近更新 更多