-3
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

4 回答 4

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

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

于 2013-10-08T16:33:16.483 回答
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)}
于 2013-10-08T16:47:11.873 回答
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),在这种情况下,这正是您想要的。

于 2013-10-08T16:52:02.287 回答
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])
于 2013-10-08T16:56:47.277 回答