我想收集已安装的软件包及其主机版本以创建网格。主机不一定具有相同的包。例如:
在第一步中我想简单存储,并打印这些值。 我应该使用什么数据结构?
我想以某种方式存储数据:
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"
但是因为我不知道有多少包,并且并非每个主机都存在所有包,我不知道该怎么做。我想我应该使用字典,但我不知道怎么做。
答案 0 :(得分: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"
答案 1 :(得分:0)
Dict最适合存储这些数据:
dict_data = {host:packagename for (host,packagename) in map(None, hosts, packagenames)}
如果有效,请尝试此操作。
答案 2 :(得分: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