如何比较字典列表的列表

时间:2019-02-28 05:59:00

标签: python-3.x dictionary

在试图将字典列表与其他字典在Python 3.7.1中的同一列表中比较时,我全神贯注(对不起,如果不清楚,我将尝试用代码将其拼写出来) )。

我实质上是在尝试编写一些Python,该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]))的事情,但是得到了一个不可散列的类型dict。

我还尝试过逐个循环查找列表中的差异,但是觉得应该有一种方法可以通过我没有得到的集合来做到这一点。

有关如何实现此目标的任何建议?我觉得我正在使事情变得比原来更复杂,但是我对Python的经验不足,所以我可能在这里犯了一个菜鸟错误。

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

1 个答案:

答案 0 :(得分: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对于管理安装在多台计算机上的软件非常方便

相关问题