Заменить значения в словаре значениями из констант - PullRequest
0 голосов
/ 07 мая 2018

Я работаю с Django, и у меня есть класс для определения некоторых констант (я использую это в моих моделях)

class ArticleStatus:

  OPEN = 'open'
  CLOSED = 'closed'
  BLOCKED = 'blocked'

  CHOICES = (
    (OPEN, 'Open'),
    (CLOSED, 'Closed'),
    (BLOCKED, 'Blocked')  
  )

На мой взгляд, у меня есть набор запросов, который дает мне такой результат:

context['total'] = [
  {'status': 'open', 'total': 102},
  {'status': 'closed', 'total': 150},
  {'status': 'blocked', 'total': 24}
]

Моя цель - преобразовать значения состояния в более читаемые значения из констант. Я сделал это с помощью следующего кода

for i in range(0, len(context['total'])):
  status = context['total'][i]['status']
  for status_const in ArticleStatus.CHOICES:
    if status == status_const[0]:
      context['total'][i]['status'] = status_const[1]

И преобразованный результат:

context['total'] = [
  {'status': 'Open', 'total': 102},
  {'status': 'Closed', 'total': 150},
  {'status': 'Blocked', 'total': 24}
]

Рабочий пример

Однако мой код выглядит не очень эффективно, и я хотел спросить, есть ли у кого-нибудь лучшее решение?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Это самое короткое, что я мог придумать:

CHOICES = {OPEN: 'Open',
           CLOSED: 'Closed',
           BLOCKED: 'Blocked'}  

print([{'status': ArticleStatus.CHOICES[x['status']],
        'total': x['total']} for x in context['total']])

Вы могли бы сократить это, сделав мутацию на месте, но я всегда ценю четкий функциональный стиль как отправную точку.

0 голосов
/ 07 мая 2018

Один из способов - использовать цикл for для итерации списка и использовать предварительно рассчитанное отображение словаря:

choice_map = dict(ArticleStatus.CHOICES)

for item in context['total']:
    item['status'] = choice_map[item['status']]

print(context)

{'total': [{'status': 'Open', 'total': 102},
           {'status': 'Closed', 'total': 150},
           {'status': 'Blocked', 'total': 24}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...