Вы хотите сгладить вложенный список, это вызывает itertools.chain
:
в одну строку:
>>> list(itertools.chain.from_iterable([a*x for a in [1,2]] if x%2 else [x] for x in range(10)))
результат:
[0, 1, 2, 2, 3, 6, 4, 5, 10, 6, 7, 14, 8, 9, 18]
даетсписок или отдельный элемент в виде списка (необходим для объединения элементов).Также не делайте list(range(10))
, range(10)
достаточно.
в этом случае вы также можете избежать внутреннего listcomp, предварительно вычислив цикл:
list(itertools.chain.from_iterable([x,x*2] if x%2 else [x] for x in range(10)))
и столько простое понимание списка, повторяющееся на генераторе:
[z for y in ([x,x*2] if x%2 else [x] for x in range(10)) for z in y]
В заключение, в данном конкретном примере, что не так с старым добрым циклом, слегка изменяющим ваш:
result = []
for x in range(10):
result.append(x)
if x%2:
result.append(x*2)
x
добавляется каждый раз, поэтому просто добавляйте x*2
, если x
нечетно.Большинство людей найдут его более читабельным, даже если это не «однострочный» текст