web-dev-qa-db-fra.com

Comment décompresser une liste de n-uplets en listes individuelles?

Duplicate possible:
ne fonction Transpose/Unzip en Python

J'ai une liste de tuples, où je veux décompresser cette liste en deux listes indépendantes. Je cherche une opération standardisée en Python.

>>> l = [(1,2), (3,4), (8,9)]
>>> f_xxx (l)
[ [1, 3, 8], [2, 4, 9] ] 

Je cherche un moyen succinct et pythonique pour y parvenir.

En gros, je recherche l’opération inverse de la fonction Zip() .

204
VaidAbhishek

Utilisez Zip(*list):

>>> l = [(1,2), (3,4), (8,9)]
>>> list(Zip(*l))
[(1, 3, 8), (2, 4, 9)]

La Zip() fonction associe les éléments de toutes les entrées, en commençant par les premières valeurs, puis les secondes, etc. En utilisant *l you appliquez tous les n-uplets dans l comme arguments séparés à la fonction Zip() , donc Zip() associe 1 avec 3 avec 8 d'abord, puis 2 avec 4 et 9. Celles-ci correspondent bien aux colonnes, ou à la transposition de l.

Zip() produit des n-uplets; si vous devez avoir des objets de liste mutables, il suffit de map() les tuples à des listes ou d'utiliser une compréhension de liste pour produire une liste de listes:

map(list, Zip(*l))          # keep it a generator
[list(t) for t in Zip(*l)]  # consume the Zip generator into a list of lists
349
Martijn Pieters

Si vous voulez une liste de listes:

>>> [list(t) for t in Zip(*l)]
[[1, 3, 8], [2, 4, 9]]

Si une liste de tuples est OK:

>>> Zip(*l)
[(1, 3, 8), (2, 4, 9)]
81
user647772