Можно ли python пропустить значение вместо предоставления None или False в случае сбоя условия в выражении if? - PullRequest
0 голосов
/ 04 августа 2020
resources = [
  {
    name: 'xxxxx',
    type: 'linux'
  },
  {
    name: 'yyyyy',
    type: 'linux'
  },
  {
    name: 'zzzzz',
    type: 'windows'
  },
]

В моем сценарии python я хотел получить linux ресурсов из списка всех ресурсов, как в приведенном выше примере JSON. Следующие две строки кода оправдали мои ожидания, но сначала необходимо удалить «Нет» с помощью фильтра, который создает другой список.

value = list((res if 'type' in res and res['type'] == 'linux' else None) for res in resources)

в результате, значение возвращает список с None

[
  {
    name: 'xxxxx',
    type: 'linux'
  },
  {
    name: 'yyyyy',
    type: 'linux'
  },
  None
]

Таким образом, я использовал фильтр, чтобы удалить None из списка.

linux_resources = list(filter(None, value))

Чтобы избежать обработки None, я думал использовать условие list(res ('type' in res and res['type'] == 'linux' and res) for res in resources), но в неудачных случаях оно дает скорее False. В конце концов, нет никакой разницы в этих двух подходах (None и False).

Есть ли лучший способ, который пропускает None или False в неудачном состоянии и добавляет объекты, только если условие выполнено в списке, в одной строке кода (коротко и четко)?

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Вместо того, чтобы писать ... if ... else ... троичное выражение, поместите условие в само понимание списка:

value = [res for res in resources if 'type' in res and res['type'] == 'linux']

Я использовал квадратные скобки [...] вместо list(...) здесь, потому что это более естественно, но вы можете использовать любой способ.

В этом случае условие 'type' in res and res['type'] == 'linux' также можно упростить до res.get('type') == 'linux', поскольку метод get возвращает None (или другое значение по умолчанию, которое вы указываете) вместо повышение KeyError при отсутствии ключа.

1 голос
/ 04 августа 2020

Да, просто сделайте

value = [res for res in resources if res['type'] == 'linux']

Простое понимание списка.

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