2013-09-26 68 views
1

我有一段时间试图为脚本创建字典,我正在尝试编写处理不同IP地址的脚本。如何在Python 3中创建这个复杂的字典?

我的问题是这样的:

鉴于d1d2,并假设d1d2总会有钥匙的数量相等:对对象, 我怎么能创造d3

d1 = {1:a, 2:b, 3:b, 4:c, 5:c} 

d2 = {one:a, two:b, three:b, four:c, five:c} 

d3 = {a:[{1:one}], b:[{2:two},{3:three}], c:[{4:four},{5:five}]} 

你可以看到d3包含的与从d1d2值键,以及在d3每个键,它有一个列表的值,其中有多个字典与关键:对对应于d1d2的原始键的值。

我一直在尝试创建d3一段时间,但我似乎无法理解如何去做。非常感谢您的帮助!前

+0

的你已经尝试了任何的例子吗?你作为输出得到了什么?你已经向我们展示了你想要的*,这真是太棒了 - 但是向我们展示你自己解决问题的努力也是一个不错的主意。如果你所需要的只是纠正一些小小的误解,这可能会是非常有用的。 –

+6

你如何期待'd3'知道“2”和“2”是一起的?如果它是'b:[{3:2},{2:3}]'那还会好吗?我可以提醒你,Python中的字典不会保存顺序.. –

+0

Ofir,如果2:2和3:3不能一起工作,它将不起作用。这两本字典可以在列表中以任意顺序出现,但每个字典中的键值都必须是我列出的。 – user1243151

回答

1

首先尖给予了答案:

reverse_d1 = {} 
for k, v in d1.iteritems(): 
    reverse_d1.set_default(v, []).append(k) 
+0

托马斯,让我试试看看我能做些什么。我已经尝试了一些东西,包括从开始的两个字典中的值添加到列表等。我所做的一切迄今为止还没有工作。 – user1243151

0

所有,感谢您的输入。对此,我真的非常感激。不幸的是我意识到我目前提出这个问题的方式,它是完全无效的。 d2中的键与子网掩码相对应,这些掩码并不都是唯一的,所以我构建它的方式甚至不是有效的字典。

很多大惊小怪的,我想出了一个有效的解决方案:

p = 0 
sysNames = ['R3','R2','R1'] 
d1 = OrderedDict([('200.200.200.2','R3'),('200.200.200.1','R2'),('172.172.172.1','R2'),('172.172.172.100','R1'),('192.168.1.151','R1')]) 

oid1 = '1.3.6.1.2.1.4.20.1.3.200.200.200.2' 
oid2 = '1.3.6.1.2.1.4.20.1.3.200.200.200.1' 
oid3 = '1.3.6.1.2.1.4.20.1.3.172.172.172.1' 
oid4 = '1.3.6.1.2.1.4.20.1.3.172.172.172.100' 
oid5 = '1.3.6.1.2.1.4.20.1.3.192.168.1.151' 

d2 = {oid1:'255.255.255.0',oid2:'255.255.255.0',oid3:'255.255.255.0',oid4:'255.255.255.0',oid5:'255.255.255.0'} 

d1keys = list(d1.keys()) 
d1values = list(d1.values()) 
maskOid = '1.3.6.1.2.1.4.20.1.3.' 

d3 = {} 

for i in range(len(sysNames)): 
    ipMaskList = list() 
    numInterfaces = d1values.count(sysNames[i]) 

    for dummy in range(numInterfaces): 
     ipMaskList.append({d1keys[p]:d2.get(maskOid+d1keys[p])}) 
     p += 1 

    d3[sysNames[i]] = ipMaskList 

作为典型的,我敢肯定,这是实现我的目标一个可怕的效率低下,令人费解的方式。我绝对不是一个优秀的程序员,只要事情正确运行,我就会很开心。

再次感谢你们您的帮助,如果任何人想发布一个更有效的解决方案,欢迎:)