Создать список значений, основываясь на соответствующих ключах - PullRequest
0 голосов
/ 20 марта 2019

У меня есть следующий словарь:

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

1 Ответ

1 голос
/ 23 марта 2019

Примечание: вы перебираете ключи total_status_dict и добавляете результаты в список. Помните, что даже если словари официально упорядочены в Python начиная с версии 3.7 (см. https://docs.python.org/3/whatsnew/3.7.html), вы не всегда управляете версией Python пользователя. Я бы предпочел построить dict key -> item -> value, где key равно Closed , Impact Statement Pending, ... и item является одним из trace_labels, чем диктант key -> [values], где values должен быть упорядочен как в trace_labels.

Ваш код неэффективен, потому что вы дважды повторяете trace_labels:

  • for item in trace_labels:
  • for ke in total_status_dict [ключ]: если элемент ке: `

Как повторить только один раз? Вместо создания 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, {}) создает пустой dict y_values_by_label[label] = {}, если y_values_by_label не имеет ключа label.

Если вы хотите превратить это в понимание, то вам нужно использовать неэффективный метод:

>>> {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}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...