Это можно сделать, используя компоновку со вложенным списком, но это не красиво. Один из способов - обернуть элементы, не входящие в список, в списки, а затем распаковать полученный 2D-список.
kwargs = {
'key1': 1,
'key2': 2,
'key3list': [1, 2, 3, 4],
}
a = [u for v in
[val if key.endswith('list') else [val] for key, val in kwargs.items()]
for u in v]
print(a)
выход
[1, 2, 1, 2, 3, 4]
Я серьезно рекомендую использовать традиционные методы зацикливания здесь, не пытайтесь делать все это в списке комп. Например,
a = []
for key, val in kwargs.items():
if key.endswith('list'):
a.extend(val)
else:
a.append(val)
print(a)
Код выше можно записать как
a = []
for key, val in kwargs.items():
meth = a.extend if key.endswith('list') else a.append
meth(val)
Но даже это немного «умно» и менее читабельно, чем в предыдущей версии.
Мы можем сделать код немного более общим, игнорируя ключи и проверяя, является ли текущий объект списком или нет:
a = []
for val in kwargs.values():
if isinstance(val, list):
a.extend(val)
else:
a.append(val)
Как отмечает Лутц Хорн, эта стратегия распаковки немного опасна, если важен порядок вывода списка, поскольку в Python традиционно простой дикт не обязательно сохраняет порядок вставки. Однако в Python 3.6+ дикты do сохраняют порядок, поэтому этот метод безопасен, но он все еще делает меня немного некомфортным. ;)