Conversion liste de tuples en liste
nuanda
-
heyquem Messages postés 808 Statut Membre -
heyquem Messages postés 808 Statut Membre -
Bonjour,
J'ai un tableau "output" (lu depuis une base de données avec Python) qui semble etre une liste de tuples.
>>print output
[(12.2817, 12.2817), (0, 0), (8.52, 8.52)]
Je voudrais le convertir en un simple tableau 1D (=liste en Python je pense):
[12.2817, 12.2817, 0, 0, 8.52, 8.52]
ou en une matrice 2x3:
12.2817 12.2817
0 0
8.52 8.52
accessible ensuite avec "output[i][j]"
Quelqu'un aurait une méthode simple et *rapide* Dans les tutos trouvés sur Google, ça semble se faire via des boucles for, ce qui n'est peut etre pas le plus efficace. Le tableau que j'ai réellement à utiliser est beaucoup plus gros...
Merci!
J'ai un tableau "output" (lu depuis une base de données avec Python) qui semble etre une liste de tuples.
>>print output
[(12.2817, 12.2817), (0, 0), (8.52, 8.52)]
Je voudrais le convertir en un simple tableau 1D (=liste en Python je pense):
[12.2817, 12.2817, 0, 0, 8.52, 8.52]
ou en une matrice 2x3:
12.2817 12.2817
0 0
8.52 8.52
accessible ensuite avec "output[i][j]"
Quelqu'un aurait une méthode simple et *rapide* Dans les tutos trouvés sur Google, ça semble se faire via des boucles for, ce qui n'est peut etre pas le plus efficace. Le tableau que j'ai réellement à utiliser est beaucoup plus gros...
Merci!
A voir également:
- Transformer une liste en tuple
- Liste déroulante excel - Guide
- Liste déroulante en cascade - Guide
- Transformer une image en icone - Guide
- Liste code ascii - Guide
- Transformer majuscule en minuscule word - Guide
3 réponses
Bonjour,
L'objet [(12.2817, 12.2817), (0, 0), (8.52, 8.52)] dont tu parles n'est pas un tableau au sens qu'a le mot tableau en Python, langage dans lequel le mot tableau renvoie à la structure de données suivante:
https://docs.python.org/3/library/array.html#module-array
Ton objet est une liste de tuples, c'est tout.
Pour convertir en liste, tu peux faire
Mais je pense que le mieux est encore de la façon suivante:
Pour représenter des matrices ou des tableaux, tu devrais voir du coté de Numpy.
NumPy is the fundamental package for scientific computing with Python. It contains among other things:
a powerful N-dimensional array object
sophisticated (broadcasting) functions
tools for integrating C/C++ and Fortran code
useful linear algebra, Fourier transform, and random number capabilities
http://numpy.scipy.org/
Numpy utilise un type d'objet qui est appelé array mais qui n'est pas le type array de Python. Les objets Numpy de type array sont des structures de données d'un type particulier propre à Numpy, qui a été défini pour obtenir une optimisation des opérations effectuée sur ce qu'on appelle tableaux et matrices dans le langage courant (c'est à dire pas les structures de données mais la représentation de données particulière qu'est graphiquement un tableau et l'être mathématique particiler qu'est une matrice).
NumPy's main object is the homogeneous multidimensional array. It is a table of elements (usually numbers), all of the same type, indexed by a tuple of positive integers.
(....)
Numpy's array class is called ndarray. It is also known by the alias array. Note that numpy.array is not the same as the Standard Python Library class array.array, which only handles one-dimensional arrays and offers less functionality.
http://www.scipy.org/Tentative_NumPy_Tutorial#head-6a1bc005bd80e1b19f812e1e64e0d25d50f99fe2
L'objet [(12.2817, 12.2817), (0, 0), (8.52, 8.52)] dont tu parles n'est pas un tableau au sens qu'a le mot tableau en Python, langage dans lequel le mot tableau renvoie à la structure de données suivante:
https://docs.python.org/3/library/array.html#module-array
Ton objet est une liste de tuples, c'est tout.
Pour convertir en liste, tu peux faire
litu = [(12.2817, 12.2817), (0, 0), (8.52, 8.52)] from itertools import imap unidim = sum(imap(list,litu),[])
Mais je pense que le mieux est encore de la façon suivante:
litu = [(12.2817, 12.2817), (0, 0), (8.52, 8.52)] unidim = [x for tu in litu for x in tu ]Quel est l'inconvénient d'avoir deux boucles for ? Cette solution est mieux car il n'y a pas transformation de chaque tuple en liste avant son addition à la liste en cours d'extension, comme dans la précédente solution.
Pour représenter des matrices ou des tableaux, tu devrais voir du coté de Numpy.
NumPy is the fundamental package for scientific computing with Python. It contains among other things:
a powerful N-dimensional array object
sophisticated (broadcasting) functions
tools for integrating C/C++ and Fortran code
useful linear algebra, Fourier transform, and random number capabilities
http://numpy.scipy.org/
Numpy utilise un type d'objet qui est appelé array mais qui n'est pas le type array de Python. Les objets Numpy de type array sont des structures de données d'un type particulier propre à Numpy, qui a été défini pour obtenir une optimisation des opérations effectuée sur ce qu'on appelle tableaux et matrices dans le langage courant (c'est à dire pas les structures de données mais la représentation de données particulière qu'est graphiquement un tableau et l'être mathématique particiler qu'est une matrice).
NumPy's main object is the homogeneous multidimensional array. It is a table of elements (usually numbers), all of the same type, indexed by a tuple of positive integers.
(....)
Numpy's array class is called ndarray. It is also known by the alias array. Note that numpy.array is not the same as the Standard Python Library class array.array, which only handles one-dimensional arrays and offers less functionality.
http://www.scipy.org/Tentative_NumPy_Tutorial#head-6a1bc005bd80e1b19f812e1e64e0d25d50f99fe2
Merci de votre reponse, ça marche bien.
J'ai donc pu convertir la liste de tuples en une unique liste.
Il se trouve que j'ai plusieurs listes comme celle ci desormais, que je veux concatener en une seule liste.
D'apres la doc, numpy fournit la fonction concatenate.
Mais je me demandais s'il n'y a pas une methode plus simple, "à la IDL", avec laquelle 2 listes A et B peuvent etre concatener en une liste C:
IDL> C = [A,B]
la commande ci-dessus en python genere une liste de listes, dans laquelle C[0] = A, et C[1]=B, alors que je voudrais acceder aux elements uniques via C[i].
D'apres vous, y'a t il un moyen simple de faire la concaténation?
Merci.
J'ai donc pu convertir la liste de tuples en une unique liste.
Il se trouve que j'ai plusieurs listes comme celle ci desormais, que je veux concatener en une seule liste.
D'apres la doc, numpy fournit la fonction concatenate.
Mais je me demandais s'il n'y a pas une methode plus simple, "à la IDL", avec laquelle 2 listes A et B peuvent etre concatener en une liste C:
IDL> C = [A,B]
la commande ci-dessus en python genere une liste de listes, dans laquelle C[0] = A, et C[1]=B, alors que je voudrais acceder aux elements uniques via C[i].
D'apres vous, y'a t il un moyen simple de faire la concaténation?
Merci.
Deux listes L1 et L2 se concatènent ainsi: L1 + L2
Ceci crée une nouvelle liste, c'est à dire un nouvel objet avec son identité (= adresse) propre
donne
18731096 est différent de 18705304
Il est aussi possible d'étendre une liste avec les éléments d'une autre avec extend()
Dans ce cas, la nouvelle liste n'est pas un nouvel objet, c'est le même objet liste qui a été étendu:
donne
L1 ne change pas d'adresse 18717832
Mais pour te renseigner sur les listes:
1) dans l'index
https://docs.python.org/3/genindex-L.html
tu cherches le mot "list" et tu cliques sur "type, operations on"
2) dans un code tu mets l'instruction
concat() n'est pas tellement utilisé à part des besoins particuliers, comme par exemple l'application de concat() au sein de map()Mais comme concat() doit recevoir deux valeurs en arguments et non pas un seul , je suis obligé dans le code suivant d'utiliser le "dépliage" d'un objet séquence par l'étoile * (me rappelle plus le nom de cette fonctionnalité)
donne
Mais évidemment on peut faire plus simplement:
Ceci crée une nouvelle liste, c'est à dire un nouvel objet avec son identité (= adresse) propre
L1 = [10,100,1000] L2 = [40,500] Ls = L1 + L2 print 'L1 ',id(L1),L1 print 'L2 ',id(L2),L2 print 'Ls ',id(Ls),Ls
donne
L1 18705304 [10, 100, 1000] L2 10755928 [40, 500] Ls 18731096 [10, 100, 1000, 40, 500]
18731096 est différent de 18705304
Il est aussi possible d'étendre une liste avec les éléments d'une autre avec extend()
Dans ce cas, la nouvelle liste n'est pas un nouvel objet, c'est le même objet liste qui a été étendu:
L1 = [10,100,1000] L2 = [40,500] print 'L1 ',id(L1),L1 print 'L2 ',id(L2),L2 L1.extend(L2) print '-------------\nL1 ',id(L1),L1
donne
L1 18717832 [10, 100, 1000] L2 18705304 [40, 500] ------------- L1 18717832 [10, 100, 1000, 40, 500]
L1 ne change pas d'adresse 18717832
Mais pour te renseigner sur les listes:
1) dans l'index
https://docs.python.org/3/genindex-L.html
tu cherches le mot "list" et tu cliques sur "type, operations on"
2) dans un code tu mets l'instruction
help(list)et ça t'affiche toutes les méthodes de la classe list
concat() n'est pas tellement utilisé à part des besoins particuliers, comme par exemple l'application de concat() au sein de map()Mais comme concat() doit recevoir deux valeurs en arguments et non pas un seul , je suis obligé dans le code suivant d'utiliser le "dépliage" d'un objet séquence par l'étoile * (me rappelle plus le nom de cette fonctionnalité)
from operator import concat
li = [([1,45,35],["j","kilo"]),
(["mer",78],[1478,102,"poule","coq",74]),
([10,20,30],[40])]
print '\n'.join(repr(el) for el in li)
lu = map(lambda x: concat(*x),li)
print
print '\n'.join(repr(el) for el in lu)
donne
([1, 45, 35], ['j', 'kilo']) (['mer', 78], [1478, 102, 'poule', 'coq', 74]) ([10, 20, 30], [40]) [1, 45, 35, 'j', 'kilo'] ['mer', 78, 1478, 102, 'poule', 'coq', 74] [10, 20, 30, 40]
Mais évidemment on peut faire plus simplement:
la = [a+b for a,b in li] print print '\n'.join(repr(el) for el in la)