返回字典中具有相同值的所有键

时间:2016-03-05 18:24:50

标签: python

我有一个文件,在本例中叫做alarm.file。下面的代码遍历文件的每一行,如果包含" Blade_HostName"它将它添加到列表中并将该行的剥离版本分配给变量,然后检查"节点:"在文件中,将Blade_HostName作为键添加到字典中,并添加"节点:"作为关键的价值。

我坚持下一步。我希望它通过字典并返回共享相同值的所有键。我可以从那里处理它。

从返回的键列表中,我将使用子进程ssh到该值,对具有该值的所有键运行命令,然后对具有其他唯一值的每个键执行相同操作(如注释中所示)底部的代码。)

提前致谢。

警报文件示例,以备不时之需:

警报类型:存储重启警报
  节点:10.xx.xx.2
  主机名:
  摘要:E CM_HELLO 7213存储10.xx.xx.1重新启动
  BladeIP_Storage_Was_restarted = 10.xx.xx.1
  Blade_HostName = r33b26
  Xcat_Info = njxcat01
  地区=新泽西州   已确认:0
  首次发生:02/24/2016 09:49:32 EST
  LastOcurrence:02/24/2016 09:49:32 EST
  发生次数= 1
 -------------------

  报警类型:存储重启警报
  节点:10.xx.xx.2
  主机名:
  摘要:E CM_HELLO 7213存储10.xx.xx.2已重新启动
  BladeIP_Storage_Was_restarted = 10.xx.xx.2
  Blade_HostName = r39b14
  Xcat_Info = njxcat01
  地区=新泽西州   已确认:0
  首次发生:02/24/2016 09:49:40 EST   LastOcurrence:02/24/2016 09:49:40 EST
  发生次数= 1
 -------------------

  报警类型:存储重启警报
  节点:10.xx.xx.3
  主机名:
  摘要:E CM_HELLO 7213存储10.xx.xx.3重新启动
  BladeIP_Storage_Was_restarted = 10.xx.xx.3
  Blade_HostName = r54b05
  Xcat_Info = njxcat01
  地区=新泽西州   已确认:0
  首次发生:02/24/2016 09:49:43 EST   LastOcurrence:02/24/2016 09:49:43 EST   发生次数= 1
 -------------------

#!/usr/bin/python3

import os, sys, subprocess

myRackDict = {}
myRack = ""
myListX = []
myBladeList = []

if len(sys.argv) <= 1:
   print('Not a valid file, please try again')
   sys.exit()
elif len(sys.argv) > 1:
   myFile = sys.argv[1]
   if myFile == '':
       sys.exit()

with open(myFile, 'r') as f:
    for line in f:
        if 'Blade_HostName' in line:
            line = line.replace('Blade_HostName = ', '')
            line = line.rstrip('\n')
            line = line.lstrip()
            #print(line)
            myRack = line
            #myBladeList.append(myRack)
        elif 'Node: ' in line:
            line = line.rstrip('\n')
            line = line.lstrip(' ')
            line = line.replace('Node: ', '')
            if not myRack in myRackDict.keys():
                myRackDict[myRack] = line
            else:
                continue

print(myRackDict)
#myString = ('for i in ' + ' '.join(myBladeList) + ' ;do echo $i; psh $i monit summary; done')
#print(myString)

"""
mySsh = subprocess.check_output("ssh " + "root@" + myxCat['hixxcat'] + " 'psh r1046b01 monit summary'", shell=True)
encoded = mySsh.decode()
print(encoded)
"""

2 个答案:

答案 0 :(得分:2)

您可以使用defaultdict轻松完成,以便每个值都与一个键列表相关联。

import collections

val_map = collections.defaultdict(list)
for k,v in myRackDict.items():
    val_map[v].append(k)

答案 1 :(得分:1)

循环遍历dict

d = {"foo": 1, "bar": 2, "baz": 1}
keys_for_1 = [k for k in d if d[k] == 1]
print(keys_for_1)

输出:

['foo', 'baz']