2016-06-28 11 views
1

Ich möchte die installierten Pakete und ihre Versionen von Hosts sammeln, um ein Raster zu erstellen. Die Hosts haben nicht unbedingt die gleichen Pakete. Zum Beispiel:2-dimensionale Wörterbuch mit Iteration

enter image description here

Im ersten Schritt möchte ich einfach Speicher mag, und diese Werte drucken. Welche Datenstruktur soll ich verwenden?

Ich möchte die Daten speichern, irgendwie diese liek:

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

ich die Werte wie das irgendwie drucken möchten:

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

Aber weil ich nicht wissen, wie viele Pakete es gibt, und nicht alle Pakete sind in jedem Host vorhanden, ich bin nicht sicher, wie dies zu tun ist. Ich denke, ich sollte ein Wörterbuch benutzen, aber ich weiß nicht wie.

Antwort

4

Mit einer defaultdict wäre eine gute Wahl. Sie könnten Ihr Wörterbuch füllen, wie in diesem Beispiel gezeigt:

from collections import defaultdict 

versions = defaultdict(dict) 

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

Durch eine defaultdict verwenden, können Sie einfach speichern Sie Ihre Konfiguration mit einer Schleife, wie Sie vorgeschlagen.

from collections import defaultdict 

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

Druck das Wörterbuch kann so ein getan werden:

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

Dict am besten ist es, diese Daten zur Speicherung:

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

Versuchen Sie dies, wenn das funktioniert.

+0

Wie wird 'map' nehme an, hier zu arbeiten? –

+0

ist es tatsächlich machen zip aber wird für ungleiche Listen keine hinzufügen: http://Stackoverflow.com/a/1277311/1965509 –

0

Wenn Sie lieber keine defaultdict verwenden, ist dies, wie es, bevor sie verfügbar waren gemacht worden wäre:

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

die dictionary.setdefault(key,default) Methode seltsam benannt. Es erhält tatsächlich den Wert für das erste Argument, wie wenn Sie dictionary[key] verwendet haben, aber wenn dieser Schlüssel nicht existiert, wird er auf den Standardwert gesetzt und gibt den Wert zurück.

drucken möchten, könnten Sie tun:

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