Понимание списка в Python: делать дополнительные для цикла, если условие проверено, иначе не делать дополнительные для цикла - PullRequest
0 голосов
/ 09 июня 2018

Я хотел бы написать следующее:

result = []

for x in list(range(10)):
    if x%2 != 0:
        for a in [1,2]:
            result.append(a*x)
    else:
        result.append(x)

с пониманием списка.

Лучшее, что я получил, было следующее:

[[a*x for a in [1,2]] if x%2!=0 else x for x in list(range(10))]

Ноон возвращает:

[0, [1, 2], 2, [3, 6], 4, [5, 10], 6, [7, 14], 8, [9, 18]]

Я хотел бы получить это:

[0, 1, 2, 2, 3, 6, 4, 5, 10, 6, 7, 14, 8, 9, 18]

Есть идеи?Можно ли сделать это в одном утверждении, не создавая два списка и не складывая их вместе?

Дайте мне знать, если мне нужно предоставить больше информации.

1 Ответ

0 голосов
/ 09 июня 2018

Вы хотите сгладить вложенный список, это вызывает 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 нечетно.Большинство людей найдут его более читабельным, даже если это не «однострочный» текст

...