2016-06-28 10 views
1

グリッドを作成するために、インストールされたパッケージとそのバージョンのホストを収集したいと思います。ホストは必ずしも同じパッケージを持っているとは限りません。たとえば:2次元辞書の繰り返し付き

enter image description here

最初のステップで、私は簡単な店に好きで、これらの値を印刷します。 どのようなデータ構造を使用する必要がありますか?私は何とかこのような値に印刷したい

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" 

をしかし、私はしませんので、私は何とかこれをliekデータを保存したい

いくつのパッケージがあるか知っていて、すべてのパッケージがすべてのホストに存在するわけではありません。どうすればよいか分かりません。私は辞書を使うべきだと思いますが、どうしたらいいのか分かりません。

答えて

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のは、これらのデータを格納するための最善の方法です:これが動作するかどうか

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

はこれを試してみてください。

+0

はどのように 'ここで働くと仮定map'さ:

あなたが行うことができ、印刷するには? –

+0

実際にはジップですが、不等号リストには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 
関連する問題