根据匹配键生成值列表

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

我有下面的字典:

{'Closed': {'High': 33, 'Medium': 474, 'Low': 47, 'Critical': 6}, 'Impact Statement Pending': {'Low': 3, 'Medium': 1, 'Critical': 0, 'High': 0}, 'New': {'Low': 1, 'High': 2, 'Critical': 2, 'Medium': 2}, 'Remediation Plan Pending': {'Medium': 10, 'Low': 1, 'Critical': 1, 'High': 0}, 'Remedy in Progress': {'Medium': 36, 'Low': 18, 'High': 4, 'Critical': 1}}

如何创建由指定键的所有值组成的列表?所有高值的列表,或所有中值的其他列表?

我目前正在实现这一点的方式似乎不是最好的方式。我有一个所有严重性级别的列表,我迭代并比较如下所示:

trace_list = ['High', 'Medium', 'Critical', 'Low']

total_status_dict = {'Closed': {'High': 33, 'Medium': 474, 'Low': 47, 'Critical': 6}, 'Impact Statement Pending': {'Low': 3, 'Medium': 1, 'Critical': 0, 'High': 0}, 'New': {'Low': 1, 'High': 2, 'Critical': 2, 'Medium': 2}, 'Remediation Plan Pending': {'Medium': 10, 'Low': 1, 'Critical': 1, 'High': 0}, 'Remedy in Progress': {'Medium': 36, 'Low': 18, 'High': 4, 'Critical': 1}}

for item in trace_labels:

     y_values = []

     for key, val in total_status_dict.items():
          for ke in total_status_dict[key]:
               if item is ke:
                    y_values.append(total_status_dict[key][ke])
python-3.7 dictionary-comprehension
1个回答
1
投票

注意:您正在迭代total_status_dict键并将结果附加到列表中。请记住,即使从3.7开始在Python中正式订购词典(请参阅https://docs.python.org/3/whatsnew/3.7.html),您也无法始终控制用户的Python版本。我宁愿建立一个字母key -> item -> value,其中keyClosedImpact Statement Pending,...和itemtrace_labels之一而不是字母key -> [values] values应该像trace_labels那样被命令。

您的代码效率不高,因为您对trace_labels进行了两次迭代:

  • for item in trace_labels:
  • for ke intotal_status_dict [key]:如果item是ke:`

如何只迭代一次?不是逐个构建y_values列表(每次都在total_status_dict上进行整个迭代),您可以一次构建多个列表:

>>> trace_labels = ['High', 'Medium', 'Critical', 'Low']
>>> total_status_dict = {'Closed': {'High': 33, 'Medium': 474, 'Low': 47, 'Critical': 6}, 'Impact Statement Pending': {'Low': 3, 'Medium': 1, 'Critical': 0, 'High': 0}, 'New': {'Low': 1, 'High': 2, 'Critical': 2, 'Medium': 2}, 'Remediation Plan Pending': {'Medium': 10, 'Low': 1, 'Critical': 1, 'High': 0}, 'Remedy in Progress': {'Medium': 36, 'Low': 18, 'High': 4, 'Critical': 1}}
>>> y_values_by_label = {}
>>> for key, value_by_label in total_status_dict.items():
...     for label, value in value_by_label.items(): # total_status_dict[key] is value_by_label
...         y_values_by_label.setdefault(label, {})[key] = value
...
>>> y_values_by_label
{'High': {'Closed': 33, 'Impact Statement Pending': 0, 'New': 2, 'Remediation Plan Pending': 0, 'Remedy in Progress': 4}, 'Medium': {'Closed': 474, 'Impact Statement Pending': 1, 'New': 2, 'Remediation Plan Pending': 10, 'Remedy in Progress': 36}, 'Low': {'Closed': 47, 'Impact Statement Pending': 3, 'New': 1, 'Remediation Plan Pending': 1, 'Remedy in Progress': 18}, 'Critical': {'Closed': 6, 'Impact Statement Pending': 0, 'New': 2, 'Remediation Plan Pending': 1, 'Remedy in Progress': 1}}

如果setdefault(label, {})没有关键的y_values_by_label[label] = {}y_values_by_label会创建一个空的dict label

如果你想在dict理解中转换它,你必须使用你的低效方法:

>>> {label:{k:v for k, value_by_label in total_status_dict.items() for l, v in value_by_label.items() if l==label} for label in trace_labels}
{'High': {'Closed': 33, 'Impact Statement Pending': 0, 'New': 2, 'Remediation Plan Pending': 0, 'Remedy in Progress': 4}, 'Medium': {'Closed': 474, 'Impact Statement Pending': 1, 'New': 2, 'Remediation Plan Pending': 10, 'Remedy in Progress': 36}, 'Critical': {'Closed': 6, 'Impact Statement Pending': 0, 'New': 2, 'Remediation Plan Pending': 1, 'Remedy in Progress': 1}, 'Low': {'Closed': 47, 'Impact Statement Pending': 3, 'New': 1, 'Remediation Plan Pending': 1, 'Remedy in Progress': 18}}
© www.soinside.com 2019 - 2024. All rights reserved.