二维字典与迭代

时间:2016-06-28 08:48:32

标签: python dictionary set

我想收集已安装的软件包及其主机版本以创建网格。主机不一定具有相同的包。例如:

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"

但是因为我不知道有多少包,并且并非每个主机都存在所有包,我不知道该怎么做。我想我应该使用字典,但我不知道怎么做。

3 个答案:

答案 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