代码之家  ›  专栏  ›  技术社区  ›  user221014

不丢失地添加或合并python字典

  •  4
  • user221014  · 技术社区  · 15 年前

    我正在尝试计算在两台服务器上的日志文件中找到的IP地址,然后在不丢失元素或计数的情况下将字典统计信息合并在一起。我在另一个堆栈溢出问题中找到了一个部分解决方案,但正如您所看到的,它将 '10.10.0.1':7 一对。

    >>> a = {'192.168.1.21':23,'127.0.0.1':5,'12.12.12.12':5,'55.55.55.55':10}
    >>> b = {'192.168.1.21':27,'10.10.0.1':7,'127.0.0.1':1}
    >>> c = {}
    >>> for elem in a:
    ...     c[elem] = b.get(elem, 0) + a[elem]
    ...
    >>> print c
    {'55.55.55.55': 10, '12.12.12.12': 5, '127.0.0.1': 6, '192.168.1.21': 50}
    

    正在将计数相加,但如果dict a中不存在该键,则会将其删除。我很难搞清楚最后一点逻辑…也许B中的elem还有另一个:如果a.get(elem,0)存在:pass-else将其添加到C中?

    6 回复  |  直到 12 年前
        1
  •  5
  •   vartec    15 年前

    在代码中替换 c = {} 具有 c = b.copy()

        2
  •  5
  •   eumiro    15 年前

    如果您有python 2.7+,请尝试 collections.Counter

    否则,请尝试以下操作:

    a = {'192.168.1.21':23,'127.0.0.1':5,'12.12.12.12':5,'55.55.55.55':10}
    b = {'192.168.1.21':27,'10.10.0.1':7,'127.0.0.1':1}
    c = {}
    for dictionary in (a,b):
        for k,v in dictionary.iteritems():
            c[k] = c.get(k, 0) + v
    
        3
  •  5
  •   DisplacedAussie    12 年前
    >>> from collections import Counter
    >>> a = {'192.168.1.21':23,'127.0.0.1':5,'12.12.12.12':5,'55.55.55.55':10}
    >>> b = {'192.168.1.21':27,'10.10.0.1':7,'127.0.0.1':1}
    >>> Counter(a) + Counter(b)
    Counter({'192.168.1.21': 50, '55.55.55.55': 10, '10.10.0.1': 7, '127.0.0.1': 6, '12.12.12.12': 5})
    
        4
  •  2
  •   llasram    15 年前

    怎么样:

    c = dict((k, a.get(k, 0) + b.get(k, 0)) for k in set(a.keys() + b.keys()))
    
        5
  •  1
  •   Alan Franzoni Jimmysnn    15 年前

    如果我知道的话,这应该是你问题的一个非常一般的答案。

    def merge_sum_dictionaries(*dicts):
        result_dict = {}
        for d in dicts:
            for key, value in d.iteritems():
                result_dict.setdefault(key, 0)
                result_dict[key] += value
        return result_dict
    
    
    
    if __name__ == "__main__":
        a = {'192.168.1.21':23,'127.0.0.1':5,'12.12.12.12':5,'55.55.55.55':10}
        b = {'192.168.1.21':27,'10.10.0.1':7,'127.0.0.1':1}
    
        print merge_sum_dictionaries(a, b)
    

    输出:

    {'55.55.55.55': 10, '10.10.0.1': 7, '12.12.12.12': 5, '127.0.0.1': 6, '192.168.1.21': 50}
    
        6
  •  1
  •   hughdbrown    15 年前

    针对python 2.6及更高版本的解决方案:

    from collections import defaultdict
    
    def merge_count_dicts(*dicts):
        result = defaultdict(int)
        for d in dicts:
            for k, v in d.items():
                result[k] += v
        return result
    
    def test():
        a = {'192.168.1.21':23,'127.0.0.1':5,'12.12.12.12':5,'55.55.55.55':10}
        b = {'192.168.1.21':27,'10.10.0.1':7,'127.0.0.1':1}
        c = merge_count_dicts(a, b)
        print c
    
    if __name__ == '__main_':
        test()