É possível retornar 2 (ou mais) itens para cada item em uma lista de compreensão?
O que eu quero (exemplo):
[f(x), g(x) for x in range(n)]
deveria retornar [f(0), g(0), f(1), g(1), ..., f(n-1), g(n-1)]
Então, algo para substituir este bloco de código:
result = list()
for x in range(n):
result.add(f(x))
result.add(g(x))
python
list-comprehension
Hashmush
fonte
fonte
Respostas:
Horários:
fonte
(f(x), g(x))
. Poderia ser melhor escrito como:def fg(x): yield x + 2; yield x ** 2; list(chain.from_iterable(fg(x) for x in range(3)))
.chain.from_iterable((func(x) for func in funcs) for x in range(n)))
. O que, aliás, eliminaria a reclamação de khachik. (Embora, em certo sentido, o meu e o dele sejam essencialmente os mesmos em termos de processo. Simplesmente definimos o gerador interno de maneira diferente.)sum(..., [])
resposta porque não requer a recriação da lista em todos os + (portanto, tem desempenho O (N) em vez de desempenho O (N ^ 2)). Ainda vou usarsum(..., [])
quando quero uma linha rápida ou estou com pressa, ou quando o número de termos sendo combinados é limitado (por exemplo, <= 10).[y for x in range(n) for y in (f(x), g(x))]
Mas provavelmente é mais lento. @jamylak Você também pode testar se quiser.Compreensão de lista dupla:
Demo:
fonte
for x in range(5): for f in (f1, f2): newlist.append(f(x))
. Eu costumava achar um pouco confuso porque ficava tentando inverter a ordem.Isso é equivalente a
[f(1),g(1)] + [f(2),g(2)] + [f(3),g(3)] + ...
Você também pode pensar nisso como:
nota: O jeito certo é usar
itertools.chain.from_iterable
ou a compreensão de lista dupla. (Não requer a recriação da lista em todos os +, portanto, tem desempenho O (N) em vez de desempenho O (N ^ 2).) Ainda vou usarsum(..., [])
quando quero uma linha rápida rápida ou estou com pressa , ou quando o número de termos sendo combinados é limitado (por exemplo, <= 10). É por isso que ainda o menciono aqui, com esta ressalva. Você também pode usar tuplas:((f(x),g(x)) for ...), ()
(ou pelo comentário de khachik, tendo um gerador fg (x) que resulta em duas tuplas).fonte
[f(1),g(1)] + [f(2),g(2)] + [f(3),g(3)] + ...
sum()
dessa forma um antipadrão e não vejo nenhuma justificativa para usá-lo em quaisquer circunstâncias. O código em sua outra resposta é menos digitado, então mesmo a desculpa "quando eu quero uma linha rápida ou estou com pressa" não é suficiente.Esta função lambda compacta duas listas em uma única:
Exemplo:
fonte
Sei que o OP está procurando uma solução de compreensão de lista, mas gostaria de oferecer uma alternativa de uso
list.extend()
.o que é marginalmente mais rápido do que usar a compreensão de lista dupla.
Versão Python: 3.8.0
fonte