2016-06-28 90 views
1

我想收集已安裝的軟件包及其版本的主機來創建一個網格。主機不一定有相同的包。例如:二維字典與迭代

enter image description here

在第一步驟中,我想簡單存儲,並打印這些值。 我應該使用什麼數據結構?

我想用來存儲數據在某種程度上liek這樣:

for .. 
    # read values 
    versions[package][host] = version 

我想以某種方式打印值是這樣的:

for packagename in packagenames 
    print packagename + ": " 
    for host in hosts 
    if versions[host][package] is not None 
     print versions[host][package] 
    print ";" 
    print "\n" 

但因爲我不知道有多少包,並且並非所有包都存在於每個主機中,我不知道如何做到這一點。我想我應該用字典,但我不知道如何。

回答

4

使用defaultdict將是一個不錯的選擇。你可以填寫你的字典,如圖所示:

from collections import defaultdict 

versions = defaultdict(dict) 

versions["openssl"]["host1"] = "1.0.1e" 
versions["openssl"]["host2"] = "1.0.1e" 
... 

通過使用defaultdict,您可以使用循環簡單地存儲你的配置,如你所說。

from collections import defaultdict 

versions = defaultdict(dict) 
for .. 
    # read values 
    versions[package][host] = version 

印刷字典可以做一個像這樣的:

for package, hosts in versions.items(): 
    print package + ": " 
    for host, version in hosts: 
     print host + ": " version 
    print "\n" 
0

快譯通是最好的存儲這些數據:

 dict_data = {host:packagename for (host,packagename) in map(None, hosts, packagenames)} 

試試這個,如果這個工程。

+0

如何'map'想在這裏工作? –

+0

其實際上在做zip,但會爲不相等的列表添加None:http://stackoverflow.com/a/1277311/1965509 –

0

如果你不想使用defaultdict,這是怎麼了會,他們可用之前已經完成:

pack_host = {} 
for ... 
    # read values 
    pack_host.setdefault(package, {})[host] = version 

dictionary.setdefault(key,default)方法奇怪的命名。它實際上獲得了第一個參數的值,就像您使用dictionary[key]一樣,但如果該鍵不存在,它會將其設置爲默認值並返回該值。

要打印,你可以這樣做:

for package_name in pack_host: 
    print package_name + ':', 
    for host in pack_host[package_name]: 
     print host, 
    print