Est-il possible de renvoyer 2 (ou plus) éléments pour chaque élément dans une compréhension de liste?
Ce que je veux (exemple):
[f(x), g(x) for x in range(n)]
devrait revenir [f(0), g(0), f(1), g(1), ..., f(n-1), g(n-1)]
Donc, quelque chose pour remplacer ce bloc de code:
result = list()
for x in range(n):
result.add(f(x))
result.add(g(x))
python
list-comprehension
Hashmush
la source
la source
Réponses:
Horaires:
la source
(f(x), g(x))
. Peut - être mieux écrit: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)))
. Ce qui éliminerait d'ailleurs la plainte de Khachik. (Bien que dans un sens, le mien et le sien soient essentiellement les mêmes en termes de processus. Nous définissons simplement le générateur interne différemment.)sum(..., [])
réponse car cela ne nécessite pas de recréer la liste tous les + (a donc des performances O (N) plutôt que des performances O (N ^ 2)). J'utiliserai toujourssum(..., [])
quand je veux un one-liner rapide ou je suis pressé, ou quand le nombre de termes combinés est borné (par exemple <= 10).[y for x in range(n) for y in (f(x), g(x))]
Mais c'est probablement plus lent. @jamylak Vous pouvez également tester cela si vous le souhaitez.Compréhension de double liste:
Démo:
la source
for x in range(5): for f in (f1, f2): newlist.append(f(x))
. J'avais l'habitude de les trouver un peu déroutants parce que j'essayais toujours d'inverser l'ordre.Cela équivaut à
[f(1),g(1)] + [f(2),g(2)] + [f(3),g(3)] + ...
Vous pouvez également le considérer comme:
note: La bonne manière est d'utiliser
itertools.chain.from_iterable
ou la double compréhension de liste. (Il ne nécessite pas de recréer la liste tous les +, donc a des performances O (N) plutôt que des performances O (N ^ 2).) J'utiliseraisum(..., [])
quand même quand je veux un one-liner rapide ou je suis pressé , ou lorsque le nombre de termes combinés est borné (par exemple <= 10). C'est pourquoi je le mentionne encore ici, avec cette mise en garde. Vous pouvez également utiliser des tuples:((f(x),g(x)) for ...), ()
(ou par commentaire de khachik, avoir un générateur fg (x) qui donne un deux-tuple).la source
[f(1),g(1)] + [f(2),g(2)] + [f(3),g(3)] + ...
sum()
de cette manière comme un anti-modèle, et je ne vois aucune justification pour l'utiliser en toutes circonstances. Le code de votre autre réponse est moins dactylographique, donc même l'excuse «quand je veux une ligne rapide ou que je suis pressé» ne suffit pas.Cette fonction lambda zippe deux listes en une seule:
Exemple:
la source
Je sais qu'OP est à la recherche d'une solution de compréhension de liste, mais j'aimerais proposer une alternative d'utilisation
list.extend()
.ce qui est légèrement plus rapide que l'utilisation de la compréhension de double liste.
Version Python: 3.8.0
la source