如何通过两个字符串参数过滤字典?

How to filter a dictionary by two string parameters?

我目前有一个通过一个参数过滤字典的脚本(如下所示):

# loop over first  dict, get keys + values
for k1, v1 in hostname_list['sap_landscape'].items():
    # loop over second dictionary, get keys + values
    for k2, v2 in v1.items():
        if k2 == "hostname" and v2 == name:
            print(v1)

控制台输入如下所示:

python3 example.py --name=dceu3005 # (I'm using click options for the input parameter)

输出看起来像这样:

{'hostname': 'dceu3005', 'SDI': 'G', 'Type': 'Optimal', 'Landscape': 'Opti', 
 'Severity': 'GTO', 'Username': None, 'UserID': None, 'Global': None, 'Cycle': 2}

我现在面临的问题是,我需要第二个参数,这意味着字典必须由一个参数(例如:名称或严重性)过滤,但也必须能够由两个参数过滤同时参数(例如:名称和严重性)所以如果我有这样的输入:

python3 example.py --name=dceu3005 --severity=PRD

它应该按两个条件进行过滤并只输出也具有指定严重性的服务器名称。

我试图通过将键和值分别分配给一个变量然后创建一个带有 if 语句的方法来解决问题,如下所示:

hostname = v1.get("hostname")
obj_severity = v1.get("Severity")

def name_and_severity(k2, v2, severity):
    if k2 == "Severity" and v2 == severity:
        return True

def name(hostname, name, severity):
    if not severity and hostname == name:
        return True
    
def severity(severity, obj_severity):
    if not name and severity == obj_severity:
        return True

但这似乎不起作用,还是我做错了什么?

如果你有时间,请向我解释你为什么这样做,这样我就可以从我的 mistakes/learn 中学到一些新东西。

您可以使用 <dict_name>.get(<key_name>) 方法获取特定键的值并将其与您定义的值匹配:

for v1 in hostname_list['sap_landscape'].values():
    if all([v1.get("hostname", None) == name,
            v1.get("Severity", None) == severity
        ]):
        print(v1)
如果没有名为 hostnameSeverity.

的键,将返回

None