Python: объект к списку извлечения кортежей - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть объект в следующем формате:

{
  'af': {
    'bidi': False, 
    'code': 'af', 
    'name': 'Afrikaans', 
    'name_local': 'Afrikaans'
  },
  'ar': {
    'bidi': True, 
    'code': 'ar', 
    'name': 'Arabic', 
    'name_local': 'العربيّة'
  },
  ...
}

Это список локалей, найденных в django.conf.locale.LANG_INFO. (полный список см. здесь: https://github.com/django/django/blob/master/django/conf/locale/ init .py ).

Теперь я надеюсь использовать этот список в классе модели:

locale = models.CharField(max_length=5, choices=get_locale_choices(), default='en')

Так, чтобы у меня была следующая служебная функция:

from django.conf.locale import LANG_INFO

def get_locale_choices():
    return ?

Теперь, когда возвращается ?, я бы хотел иметь следующий формат:

[
    ('af', 'Afrikaans'),
    ('ar', 'Arabic'),
    ...
]

У меня такой вопрос, как мне превратить словарь LANG_INFO в приведенный выше список кортежей?

Такое ощущение, что что-то вроде этого близко:

a_dict = {'color': 'blue', 'fruit': 'apple', 'pet': 'dog'}
d_items = a_dict.items()
d_items  # Here d_items is a view of items
dict_items([('color', 'blue'), ('fruit', 'apple'), ('pet', 'dog')])

Но ... хм, не уверен? Я хочу извлечь дополнительное значение из ключевого элемента ...

1 Ответ

3 голосов
/ 19 февраля 2020

Использовать понимание списка:

from django.conf.locale import LANG_INFO

def get_locale_choices():
    return [(k, v['name']) for k, v in LANG_INFO.items() if 'name' in v]

Часть ... if 'name' in v необходима для обеспечения того, чтобы дела имели 'fallback', но не 'name' (например, zh-cn, zh-my, zh-sg, et c.) Игнорируются.

Результат:

[('af', 'Afrikaans'), ('ar', 'Arabic'), ...]

Примечание: django.conf.locale.LANG_INFO кажется внутренним по отношению к Django, поэтому вы его не используете Официально санкционировано Django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...