Comment compresser des listes dans une liste

92

Je veux compresser la liste de listes suivante:

>>> zip([[1,2], [3,4], [5,6]])
[[1,3,5], [2,4,6]]

Cela pourrait être réalisé avec l' zipimplémentation actuelle uniquement si la liste est divisée en composants individuels:

>>> zip([1,2], [3,4], [5,6])
   (1, 3, 5), (2, 4, 6)]

Impossible de comprendre comment diviser la liste et transmettre les éléments individuels à zip. Une solution fonctionnelle est préférée.

Vijay Mathew
la source

Réponses:

146

Essaye ça:

>>> zip(*[[1,2], [3,4], [5,6]])
[(1, 3, 5), (2, 4, 6)]

Voir Déballage des listes d'arguments :

La situation inverse se produit lorsque les arguments sont déjà dans une liste ou un tuple mais doivent être décompressés pour un appel de fonction nécessitant des arguments positionnels séparés. Par exemple, la fonction intégrée range () attend des arguments de démarrage et d'arrêt séparés. S'ils ne sont pas disponibles séparément, écrivez l'appel de fonction avec l'opérateur * pour décompresser les arguments d'une liste ou d'un tuple:

>>> range(3, 6)             # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args)            # call with arguments unpacked from a list
[3, 4, 5]
Mark Byers
la source
4
Voir docs.python.org/tutorial/… pour savoir comment cela fonctionne.
ameer
2
J'aimerais voir une alternative au cas où vous auriez une liste avec un million d'entrées. Ce n'est peut-être pas une bonne idée de décompresser un million d'éléments dans un appel de fonction ...
Blixt