it-swarm.com.de

Mehrere Listen gleichzeitig anhängen? (Python)

Ich habe eine Reihe von Listen, die ich an eine einzige Liste anhängen möchte, die eine Art "Hauptliste" in einem Programm ist, das ich schreiben möchte. Gibt es eine Möglichkeit, dies in einer Codezeile statt in 10 zu tun? Ich bin ein Anfänger, also habe ich keine Ahnung ...

Für ein besseres Bild meiner Frage, was wäre, wenn ich diese Listen hätte:

x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]

Und will y und z an x ​​anhängen. Statt zu tun:

x.append(y)
x.append(z)

Gibt es eine Möglichkeit, dies in einer Codezeile zu tun? Ich habe es schon versucht:

x.append(y, z)

Und es wird nicht funktionieren.

20
anon
x.extend(y+z)

soll tun was du willst

oder 

x += y+z

oder auch

x = x+y+z
37
Joran Beasley

Meinen Kommentar erweitern

In [1]: x = [1, 2, 3]
In [2]: y = [4, 5, 6]
In [3]: z = [7, 8, 9]
In [4]: from itertools import chain
In [5]: print list(chain(x,y,z))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
15
night-crawler

Sie können die Funktion sum mit angegebenem Startwert (leere Liste) verwenden:

a = sum([x, y, z], [])

Dies ist besonders geeignet, wenn Sie eine beliebige Anzahl von Listen anhängen möchten.

10
Minjoon Seo

Mit der folgenden einfachen und effektiven Funktion können Sie den Effekt des Anfügens exakt replizieren:

a=[]
def concats (lists):
    for i in lists:
        a==a.append(i)


concats ([x,y,z])
print(a)
3
jillm_5

Äquivalent zur obigen Antwort, aber ausreichend verschieden, um erwähnenswert zu sein:

my_map = {
   'foo': ['a', 1, 2],
   'bar': ['b', '2', 'c'],
   'baz': ['d', 'e', 'f'],
} 
list(itertools.chain(*my_map.values()))
['d', 'e', 'f', 'a', 1, 2, 'b', '2', 'c']

in dem obigen Ausdruck ist * für das Ergebnis des Zerhackens wichtig, da es sich um eine Kette handelt, die der vorherigen Kette (x, y, z) entspricht. Beachten Sie auch, dass das Ergebnis in Hash-Reihenfolge angeordnet ist.

1
msudder

Wenn Sie einen etwas funktionaleren Ansatz bevorzugen, können Sie Folgendes versuchen:

import functools as f

x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]

x = f.reduce(lambda x, y: x+y, [y, z], x)

Auf diese Weise können Sie beliebig viele Listen mit der Liste x verknüpfen.

Wenn Sie nur eine beliebige Anzahl von Listen miteinander verketten möchten (d. H. Nicht auf einer Basisliste), können Sie Folgendes vereinfachen:

import functools as f
from operator import add
big_list = f.reduce(add, list_of_lists)

Beachten Sie, dass unser BFDL Vorbehalte gegenüber Lambdas, Reductions und Freunden hat: https://www.artima.com/weblogs/viewpost.jsp?thread=98196

Um diese Antwort zu vervollständigen, können Sie in der Dokumentation mehr zum Verkleinern lesen: https://docs.python.org/3/library/functools.html#functools.reduce

Ich zitiere: "Wende die Funktion zweier Argumente kumulativ auf die Elemente der Reihenfolge von links nach rechts an, um die Folge auf einen einzelnen Wert zu reduzieren."

P.S. Die Verwendung von sum() wie in https://stackoverflow.com/a/41752487/532513 beschrieben ist superkompakt, scheint mit Listen zu funktionieren und ist sehr schnell (siehe https://stackoverflow.com/ a/33277438/532513 ), aber help(sum) in Python 3.6 hat Folgendes zu sagen:

Diese Funktion ist speziell für die Verwendung mit numerischen Werten vorgesehen und kann nicht-numerische Typen ablehnen.

Obwohl dies etwas besorgniserregend ist, werde ich es wahrscheinlich als meine erste Option für das Verketten von Listen beibehalten.

1
Charl Botha

In einer Zeile kann dies auf folgende Weise erfolgen 

x.extend(y+z)

oder 

x=x+y+z
0
SomnAth Pal