Wie fusionieren ich ein 2D-Array in Python in eine Zeichenfolge mit Listenkomprehension?

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

  •  01-07-2019
  •  | 
  •  

Frage

Listenkomprehension für mich scheint, wie der undurchsichtige Granitblock, die regulären Ausdrücke sind für mich zu sein. Ich brauche Zeiger.

Sagen Sie, ich habe eine 2D-Liste:

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

Das möchte ich fusionieren entweder in eine lange Liste

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

oder in einen String mit Trennzeichen:

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

Wirklich, ich würde gerne wissen, wie beides zu tun.

War es hilfreich?

Lösung

Wie so:

[ item for innerlist in outerlist for item in innerlist ]

Drehen, die direkt in einen String mit Trennzeichen:

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

Ja, die Reihenfolge der ‚für innerlist in outerlist‘ und ‚für Artikel in innerlist‘ korrekt ist. Auch wenn der „Körper“ der Schleife zu Beginn des listcomp, die Reihenfolge der verschachtelten Schleifen (und ‚wenn‘ Klauseln) ist immer noch die gleiche, wie wenn Sie die Schleife schreiben würden aus:

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

Andere Tipps

Versuchen Sie Folgendes:

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

Sie können es wie folgt lesen:
Geben Sie mir die Liste aller ys.
Die ys kommt von dem xs.
Die xs kommt aus li.

So ordnen, dass in einem String:

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

Es gibt ein paar Möglichkeiten. Erstens können Sie einfach eine neue Liste erstellen und den Inhalt jeder Liste, um es hinzuzufügen:

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

Alternativ können Sie die itertools Moduls chain Funktion verwenden, die eine iterable alle Elemente in mehreren Iterables enthält, erzeugt:

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

Wenn Sie diesen Ansatz nehmen, können Sie die Zeichenfolge erzeugen, ohne eine Zwischenliste zu erstellen:

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

Mein Favorit, und die kürzeste, ist dies:

li2 = sum(li, [])

und

s = ','.join(li2)

EDIT: Verwendung sum statt reduce, (dank Thomas Wouters !)

Um es eine abgeflachte Liste Gebrauch zu machen entweder:

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

Dann join macht es zu einem String.

Für die zweiten, gibt es eine integrierte String-Methode, das zu tun:

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

Für die erste, können Sie innerhalb eines Verstehens Liste JOIN:

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

Aber es ist einfacher zu bedienen 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 ist ein Modul, das Ihnen helfen, mit Iteratoren wie Liste, Tupel oder String mit gemeinsamen Aufgaben zu beschäftigen ... Es ist praktisch, weil es nicht eine Kopie der Struktur speichert Sie arbeiten, aber verarbeiten die Elemente eins nach dem anderen.

EDIT: lustig, ich viel unterwegs bin lernen, es zu tun. Wer hat gesagt, dass es nur eine gute Möglichkeit war, es zu tun?

Es gibt viele Möglichkeiten, dieses Problem zu tun. Ich mag Numpy 's-Tools, weil sie normalerweise in alles bereits importiert ich. Wenn Sie jedoch verwenden Numpy nicht für irgendetwas anderes ist dies wahrscheinlich nicht eine gute Methode.

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

Dies würde drucken [0 1 2 3 4 5 6 7 8] und dann können Sie diese in Ihre Zeichenfolge konvertieren.

import itertools
itertools.flatten( li )
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top