将两个字典合并为两个单独的值

时间:2013-10-08 16:11:35

标签: python python-2.7 dictionary

dict1 = {a:10, b:15, c:20}
dict2 = {a:25, b:30, c:35}

我想输出的是:

dict3 = {a : (10, 25), b : (15, 30), c : (20, 35)}

以下是我所拥有的样本

dict1 = {'192.168.1.21':23,'127.0.0.1':5,'12.12.12.12':5,'55.55.55.55':10}
dict2 = {'192.168.1.21':27,'10.10.0.1':7,'127.0.0.1':1}
dict3 = {}

for dictionary in (dict1,dict2):
  for k,v in dictionary.iteritems():
    dict3[k] = dict3.get(k, 0) + v

任何人都可以帮助我吗

4 个答案:

答案 0 :(得分:1)

我可能会这样做:

>>> dict1 = {'192.168.1.21':23,'127.0.0.1':5,'12.12.12.12':5,'55.55.55.55':10}
>>> dict2 = {'192.168.1.21':27,'10.10.0.1':7,'127.0.0.1':1}
>>> ds = dict1, dict2
>>> {k: tuple(d.get(k, 0) for d in ds) for k in set().union(*ds)}
{'55.55.55.55': (10, 0), '10.10.0.1': (0, 7), '12.12.12.12': (5, 0), 
'127.0.0.1': (5, 1), '192.168.1.21': (23, 27)}

这使用了一些技巧。 set().union(*ds)获取字典中所有键的并集:

>>> set().union(*ds)
set(['55.55.55.55', '10.10.0.1', '12.12.12.12', '192.168.1.21', '127.0.0.1'])

(帽子提示@JonClements。我曾经写过set.union(*(map(set, ds))),我从不喜欢set的重复。)

tuple(d.get(k, 0) for d in ds)0或每个字典中与键k关联的值创建一个元组。

整个事情都包含在字典理解中,因此我们不需要任何其他循环。

答案 1 :(得分:0)

相反,请尝试写作:

for k in set(dict1.keys())|set(dict2.keys()):
    dict3[k] = (dict1.get(k,0),dict2.get(k,0))

这将从两个词典中获取所有键,并将它们的值作为元组返回,就像您想要的那样。如果其中一个列表不存在该键,则返回零,但您可以将其更改为您可能需要的任何值。

所以:

dict1 = {'192.168.1.21':23,'127.0.0.1':5,'12.12.12.12':5,'55.55.55.55':10}
dict2 = {'192.168.1.21':27,'10.10.0.1':7,'127.0.0.1':1}

它将返回:

dict3 = {'55.55.55.55': (10, 0), '10.10.0.1': (0, 7), '12.12.12.12': (5, 0), 
         '127.0.0.1': (5, 1), '192.168.1.21': (23, 27)}

答案 2 :(得分:0)

for dictionary in (dict1,dict2):
  for k,v in dictionary.iteritems():
    dict3[k] = dict3.get(k, 0) + v

在这里,您要添加0的值,从而产生单个值。你想要一个元组,所以对于这种方法,你需要从一个空元组开始并添加一个新值的单项元组:

dict3[k] = dict3.get(k, ()) + (v,)

我对这种方法的不满意在于,您正在迭代两个词典的所有项目,完全违背了使用词典的目的(通过键快速查找特定项目)。如果dict1至少包含dict2中的所有密钥,我会这样做:

dict3 = dict((key, (value1, dict2.get(key, 0))) for key, value1 in dict1.iteritems())

这将组合所有匹配的键,并为dict1中不存在于dict2中的每个键插入0。但是,如果dict2也有dict1没有的密钥,那么确保获得所有密钥的唯一方法就是迭代这两个字典。当然,您可能只关心dict1的密钥(即您不需要查看没有匹配的源IP的目标IP),在这种情况下,这是正是你想要的。

答案 3 :(得分:0)

#You can use has_key() dictionary built in function# 

for k,v in dict1.items()
       if dict2.has_key(k):
              dict3[k]=(v,dict2[k])