如何比较字典列表

问题描述 投票:0回答:1

在Python 3.7.1的同一列表中比较了一个字典列表与其他词典的列表(对不起,如果不清楚的话......我会尝试用代码拼出来)。

我本质上是在尝试编写一些python来比较用户提供的动态数量的服务器上安装的内容。简化的数据集基本上如下所示:

[
  [
   {'server':'serverA', 'software':'hadoop','version':'1.0'},
   {'server':'serverA', 'software':'python','version':'3.6'},
   {'server':'serverA', 'software':'pip','version':'18.0'}
  ],
  [
   {'server':'serverB', 'software':'python','version':'3.5'},
   {'server':'serverB', 'software':'pip', 'version': '18.0'}
  ],
  [
   {'server':'testServerA', 'software':'hadoop','version':'1.0'},
   {'server':'testServerA', 'software':'pip', 'version':'18.0'}
  ],
  [
   {'server':'testServerB', 'software':'hadoop','version':'1.0'},
   {'server':'testServerB', 'software':'python','version':'3.6'},
   {'server':'testServerB', 'software':'pip','version':'18.0'},
   {'server':'testServerB', 'software':'ruby','version':'2.5'}
  ]
]

我本质上是在尝试确定哪些服务器安装了其他服务器,而其他服务器与其他服务器不同。目标是轻松识别所有服务器上更新/安装的需求以使它们相等。在此示例中,结果将是:

serverA has hadoop 1.0 but serverB does not have Hadoop installed
serverA has python 3.6 but serverB has python 3.5
testServerA is missing python.
testServerB has ruby but the other's do not (another way to put it would be serverA, serverB, and testServerA are missing ruby).

上面的数据集实际上是这个python代码的打印(目前硬编码服务器名称以进行测试,但稍后将通过UI中的选项提供):

    servers = ['serverA','serverB','testServerA','testServerB']
    installedSoftware = []
    for server in servers:
      installedSoftware.append('localhost/installed_software/?server=' + server).json())
    print(installedSoftware)

我尝试过像print(set(installedSoftware[0]) - set(installedSoftware[1]))这样的东西,但得到了一个不可用的类型字典。

我也尝试逐个循环遍历列表以试图找到差异,但感觉应该有一种方法来通过我没有得到的集合来做到这一点。

关于如何实现这一目标的任何建议?我觉得我让它变得比以前更加复杂,但我对Python不是很有经验,所以我可能会在这里犯一个菜鸟错误。

感谢您提供的任何帮助或建议!

python-3.x dictionary
1个回答
0
投票

根据您的用例,您可以访问所有必需软件及其当前最新版本的列表。

expectedSw = OrderedDict([('hadoop', '1.0'), ('python', '3.6'), ('pip', '18.0'), 
('ruby', '2.5')])
currentInstallation = [] # Your data

for server in currentInstallation:
    for program in expectedSw.keys():
        if not any(sw.get('software', None) == program and
                   sw.get('version', None) == expectedSw[program] for sw in server):
            print '{} not installed or outdated on {}'.format(program, server[0]['server'])

如果您无权访问程序列表及其最新版本,则可以从已安装的软件版本数据中获取该程序。

旁注:Puppet对于管理安装在多台机器上的软件非常方便

© www.soinside.com 2019 - 2024. All rights reserved.