Comment fusionner un tableau 2D en Python en une seule chaîne avec une compréhension en liste?

StackOverflow https://stackoverflow.com/questions/103844

  •  01-07-2019
  •  | 
  •  

Question

Liste La compréhension pour moi semble être comme le bloc de granite opaque que les expressions régulières sont pour moi. J'ai besoin de pointeurs.

Dites, j'ai une liste 2D:

li = [[0,1,2],[3,4,5],[6,7,8]]

Je voudrais fusionner ceci soit dans une longue liste

li2 = [0,1,2,3,4,5,6,7,8]

ou dans une chaîne avec des séparateurs:

s = "0,1,2,3,4,5,6,7,8"

Vraiment, j'aimerais savoir comment faire les deux.

Était-ce utile?

La solution

Comme si:

[ item for innerlist in outerlist for item in innerlist ]

Transformer cela directement en une chaîne avec des séparateurs:

','.join(str(item) for innerlist in outerlist for item in innerlist)

Oui, l'ordre de 'for innerlist dans outerlist' et 'pour article dans innerlist' est correct. Même si le & corps; corps " de la boucle est au début de la liste, l'ordre des boucles imbriquées (et les clauses 'if') est toujours le même que lorsque vous écririez la boucle:

for innerlist in outerlist:
    for item in innerlist:
        ...

Autres conseils

Essayez ça:

li=[[0,1,2],[3,4,5],[6,7,8]]
li2 = [ y for x in li for y in x]

Vous pouvez le lire comme ceci:
Donnez-moi la liste de tous les ys.
Les y viennent des xs.
Les x viennent de li.

Pour mapper cela dans une chaîne:

','.join(map(str,li2))

Il y a plusieurs choix. Tout d'abord, vous pouvez simplement créer une nouvelle liste et y ajouter le contenu de chaque liste:

li2 = []
for sublist in li:
    li2.extend(sublist)

Vous pouvez également utiliser la fonction chaîne du module itertools , qui produit un élément itérable contenant tous les éléments de plusieurs éléments itérables:

import itertools
li2 = list(itertools.chain(*li))

Si vous utilisez cette approche, vous pouvez produire la chaîne sans créer de liste intermédiaire:

s = ",".join(itertools.chain(*li))

Mon préféré, et le plus court, est le suivant:

li2 = sum(li, [])

et

s = ','.join(li2)

EDIT: utilisez sum au lieu de reduction (merci Thomas Wouters !)

Pour en faire une liste aplatie, utilisez soit:

  1. http://code.activestate.com/recipes/121294/
  2. http://code.activestate.com/recipes/363051/

Ensuite, join pour en faire une chaîne.

Pour le second, il existe une méthode de chaîne intégrée pour le faire:

>>> print ','.join(str(x) for x in li2)
"0,1,2,3,4,5,6,7,8"

Pour le premier, vous pouvez utiliser rejoindre dans une liste de compréhension:

>>> print ",".join([",".join(str(x) for x in li])
"0,1,2,3,4,5,6,7,8"

Mais il est plus facile d'utiliser itertools.flatten:

>>> import itertools
>>> print itertools.flatten(li)
[0,1,2,3,4,5,6,7,8]
>>> print ",".join(str(x) for x in itertools.flatten(li))
"0,1,2,3,4,5,6,7,8"

NB: itertools est un module qui vous aide à gérer des tâches courantes avec des itérateurs tels que list, tuples ou string ... C'est pratique car il ne stocke pas une copie de la structure sur laquelle vous travaillez mais traite les éléments. un par un.

EDIT: drôle, j'apprends plein de façons de le faire. Qui a dit qu'il n'y avait qu'un seul moyen de le faire?

Il existe de nombreuses façons de résoudre ce problème. J'aime les outils de Numpy car ils sont normalement déjà importés dans tout ce que je fais. Cependant, si vous n'utilisez pas Numpy pour autre chose, ce n'est probablement pas une bonne méthode.

import numpy
li = [[0,1,2],[3,4,5],[6,7,8]]
li2=li[0] #first element of array to merge
i=1 
while i<len(li):
    li2=numpy.concatenate((li2,li[i]))
    i+=1
print li2

Ceci afficherait [0 1 2 3 4 5 6 7 8], puis vous pourrez également le convertir en chaîne.

import itertools
itertools.flatten( li )
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top