Python3 поможет определить наиболее питонический подход к динамическому созданию списка

1

Ищите помощь от экспертов здесь, чтобы помочь сделать правильный выбор в программе, которую я создаю. Какой из двух подходов для создания списка выглядит более питоническим и читаемым для вас? Или есть лучший способ, которым я мог бы это сделать?

Подход №1 - понимание списка

def test_func(*args):
    s = 'Country name: United {nm}'
    l = [s.format(nm='States') if x is 'us' 
         else s.format(nm='Arab Emirates') if x is 'uae'
         else s.format(nm='Kingdom') if x is 'uk' 
         else 'Unknown' for x in args]
    return l

# execute
test_func('us', 'uk', 'uae')

# results
['Country name: United States',
 'Country name: United Kingdom',
 'Country name: United Arab Emirates']

Подход № 2 - для цикла

def test_func(*args):
    s = 'Country name: United {nm}'
    l = []
    for arg in args:
        if arg is 'us':
            l.append(s.format(nm='States'))
        elif arg is 'uk':
            l.append(s.format(nm='Kingdom'))
        elif arg is 'uae':
            l.append(s.format(nm='Arab Emirates'))
        else:
            l.append(s.format(nm='Unknown'))
    return l

# execute
test_func('us', 'uk', 'uae')

# results
['Country name: United States',
 'Country name: United Kingdom',
 'Country name: United Arab Emirates']
  • 0
    Кроме: не использовать is для сравнения строк. Смотрите здесь на разницу между is и == .
  • 0
    Более питонический подход состоит в том, чтобы использовать здесь отображение dict , как и ответ ниже, но в целом вложенные условные выражения не очень удобочитаемы для IMO. Петли For в значительной степени всегда питонны.
Показать ещё 1 комментарий
Теги:
python-3.x
list-comprehension

1 ответ

6
Лучший ответ

Вы настроены на неверный уровень. Используйте dict так:

Код:

def test_func(*args):
    mapping = {
        'us': 'United States',
        'uae': 'United Arab Emirates',
        'uk': 'United Kingdom',
    }
    return ['Country name: {}'.format(mapping.get(x, 'Unknown')) for x in args]

# execute
print(test_func('us', 'uk', 'uae', 'xyzzy'))

Результаты:

[
    'Country name: United States', 
    'Country name: United Kingdom', 
    'Country name: United Arab Emirates',
    'Country name: Unknown'
]
  • 2
    Может быть, использовать .get для обработки «неизвестного» случая OP?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню