【问题标题】:Generate list of values, based on matching keys根据匹配的键生成值列表
【发布时间】:2019-03-20 20:51:14
【问题描述】:

我有以下字典:

{'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】:

    注意:您正在迭代 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]: if item is 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[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}}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多