Wie fusionieren ich ein 2D-Array in Python in eine Zeichenfolge mit Listenkomprehension?
-
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.
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:
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 )