Понимание списка с ранней условной проверкой - PullRequest
0 голосов
/ 06 января 2020

Для данного списка l

l = [{'k': [1, 2]}, {'k': [2, 8]}, {'k': [6, 32]}, {}, {'s': 0}]

, где я хотел бы иметь единый список всех значений

r = [1, 2, 2, 8, 6, 32]

и код

r = []
for item in l:
    if 'k' in item:
        for i in item['k']:
            r += [i]

существует ли элегантное решение для понимания списка для такого рода списков?

Очевидно,

[i for i in item['k'] if 'k' in item for item in l]

завершится неудачно, потому что к item['k'] осуществляется доступ до проверки условия. Есть идеи?

Ответы [ 2 ]

4 голосов
/ 06 января 2020

Используйте get, чтобы создать пустой список для повторения, если k не существует.

r = [i for d in l for i in d.get('k', [])]

Или проверьте k, прежде чем пытаться получить доступ к его значению.

r = [i for d in l if 'k' in d for i in d['k']]
1 голос
/ 06 января 2020

У вас почти есть правильное решение с вашим списком понимания. Просто порядок утверждений внутри понимания списка неправильный. Пожалуйста, попробуйте следующее.

l = [{'k': [1, 2]}, {'k': [2, 8]}, {'k': [6, 32]}, {}, {'s': 0}]
answer = [i for item in l if 'k' in item for i in item['k'] ]
print(answer)

Это то, что вы хотели?

...