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

Python 返回字典中具有相同值的所有键,python,Python,我有一个文件,在本例中称为alarm.file。下面的代码遍历文件的每一行,如果包含“Blade_主机名”,则将其添加到列表中,并将该行的精简版本分配给变量,然后检查文件中的“Node:”,并将Blade_主机名添加为字典中的键,并将“Node:”添加为键的值 我被困在下一步。我希望它遍历字典并返回所有共享相同值的键。我可以从那里处理 从返回的密钥列表中,我将使用subprocess对值进行ssh,对具有该值的所有密钥运行命令,然后对具有其他唯一值的每个密钥执行相同的操作(如底部注释掉的代码所示

我有一个文件,在本例中称为alarm.file。下面的代码遍历文件的每一行,如果包含“Blade_主机名”,则将其添加到列表中,并将该行的精简版本分配给变量,然后检查文件中的“Node:”,并将Blade_主机名添加为字典中的键,并将“Node:”添加为键的值

我被困在下一步。我希望它遍历字典并返回所有共享相同值的键。我可以从那里处理

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

提前谢谢

如果需要,alarm.file的示例:

警报类型:存储重启警报
节点:10.xx.xx.2
主机名:
摘要:E CM_HELLO 7213存储10.xx.xx.1已重新启动
BladeIP存储已重新启动=10.xx.xx.1
刀片服务器主机名=r33b26
Xcat_Info=njxcat01
地区=NJ
已确认:0
首次出现:2016年2月24日09:49:32东部时间
最近发生时间:2016年2月24日09:49:32美国东部时间
出现次数=1
-------------------

警报类型:存储重启警报
节点:10.xx.xx.2
主机名:
摘要:E CM_HELLO 7213存储10.xx.xx.2已重新启动
BladeIP存储已重新启动=10.xx.xx.2
刀片服务器主机名=r39b14
Xcat_Info=njxcat01
地区=NJ
已确认:0
第一次出现:2016年2月24日09:49:40美国东部时间
最近发生时间:2016年2月24日09:49:40美国东部时间
出现次数=1
-------------------

警报类型:存储重启警报
节点:10.xx.xx.3
主机名:
摘要:E CM_HELLO 7213存储10.xx.xx.3已重新启动
BladeIP存储已重新启动=10.xx.xx.3
刀片服务器主机名=r54b05
Xcat_Info=njxcat01
地区=NJ
已确认:0
首次出现:2016年2月24日09:49:43东部时间
最近发生时间:2016年2月24日09:49:43美国东部时间
出现次数=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)
"""
#/usr/bin/python3
导入操作系统、系统、子流程
myRackDict={}
myRack=“”
myListX=[]
myBladeList=[]
如果len(sys.argv)1:
myFile=sys.argv[1]
如果myFile='':
sys.exit()
打开(myFile,'r')作为f:
对于f中的行:
如果行中有“刀片服务器主机名”:
line=line.replace('Blade_主机名=','')
line=line.rstrip('\n')
line=line.lstrip()
#打印(行)
myRack=行
#myBladeList.append(myRack)
elif“Node:”行中:
line=line.rstrip('\n')
line=line.lstrip(“”)
line=line.replace('节点:','')
如果不是myRackDict.keys()中的myRack:
myRackDict[myRack]=行
其他:
持续
打印(myRackDict)
#myString=('fori in'+'.join(myBladeList)+';do echo$i;psh$i monit summary;done')
#打印(myString)
"""
mySsh=subprocess.check_输出(“ssh”+“root@”+myxCat['hixxcat']+“'psh r1046b01 monit summary'”,shell=True)
encoded=mySsh.decode()
打印(编码)
"""

指令上循环:

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']

指令上循环:

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']

您可以使用
defaultdict
轻松地执行此操作,这样每个值都与键列表相关联

import collections

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

您可以使用
defaultdict
轻松地执行此操作,这样每个值都与键列表相关联

import collections

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

你还有一个问题。由于节点位于Blade_主机名之前,
myRackDict[myRack]=line
正在使用上一节中的旧刀片。我没有意识到。。谢谢你指出这一点。我看看能不能修好。@tdelaney我知道我哪里搞砸了。最初我使用的是另一个字段,它显示在Blade_主机名之后,我将其更改为Node。我会重新安排的。再次感谢你指出这一点。你还有一个问题。由于节点位于Blade_主机名之前,
myRackDict[myRack]=line
正在使用上一节中的旧刀片。我没有意识到。。谢谢你指出这一点。我看看能不能修好。@tdelaney我知道我哪里搞砸了。最初我使用的是另一个字段,它显示在Blade_主机名之后,我将其更改为Node。我会重新安排的。再次感谢您指出这一点。非常有效。谢谢,工作做得很好。非常感谢。