2013-09-26 69 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 

作爲典型的,我敢肯定,這是實現我的目標一個可怕的效率低下,令人費解的方式。我絕對不是一個優秀的程序員,只要事情正確運行,我就會很開心。

再次感謝你們您的幫助,如果任何人想發佈一個更有效的解決方案,歡迎:)