Eine Liste in zwei weitere Listen unterteilen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
terminator
User
Beiträge: 7
Registriert: Mittwoch 20. Oktober 2021, 11:04

Guten Tag,

ich habe folgendes Problem: Ich möchte eine Liste, wo jedes Listenelement aus zwei Zahlen besteht(getrennt durch ein Leerzeichen), in zwei Listen unterteilen. Das heißt ich möchte die erste Zahl im Listenelement in eine Liste(w1) und die zweite Zahl im Listenelement in eine andere Liste(w2). Jedoch habe ich damit Schwierigkeiten dies hinzubekommen.

Liste1 = ['-50 -300' , '15 -70']

#und als Ausgabe:

w1 =['-50', '15']
w2 =['-300', '-70']

Danke schon mal für die Hilfe!
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Und wo konkret sind die Schwierigkeiten? Weißt Du, wie man mit Listen arbeitet? Oder mit Strings?
terminator
User
Beiträge: 7
Registriert: Mittwoch 20. Oktober 2021, 11:04

Sirius3 hat geschrieben: Mittwoch 20. Oktober 2021, 17:57 Und wo konkret sind die Schwierigkeiten? Weißt Du, wie man mit Listen arbeitet? Oder mit Strings?
Ich habe mit split() versucht die einzelnen Listenelemente zu teilen jedoch bekomme ich dort nur die ersten Zahlen der Listenelemente ausgegeben. Ich möchte aber als Ausgabe auch noch eine zweite Liste mit den zweiten Zahlen von jedem Listenelement:

for c in Liste1:
w1=c.split()
print(w1[0])
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Du solltest dringend an Deiner Namenswahl für Variablen arbeiten. Warum benutzt Du nur einzelne Buchstaben mit einer 1 drangehängt? Das macht keinen Sinn. Variablennamen sollten sprechend sein.

Was glaubst Du, macht die [0] in Deinem Code?
terminator
User
Beiträge: 7
Registriert: Mittwoch 20. Oktober 2021, 11:04

Sirius3 hat geschrieben: Mittwoch 20. Oktober 2021, 18:51 Du solltest dringend an Deiner Namenswahl für Variablen arbeiten. Warum benutzt Du nur einzelne Buchstaben mit einer 1 drangehängt? Das macht keinen Sinn. Variablennamen sollten sprechend sein.

Was glaubst Du, macht die [0] in Deinem Code?
Alles klar!
Die [0] in meinem Code ist die Index Nummer und theoretisch müsste dann mir nur das erste Listenelement von w1 ausgegeben werden was jedoch nicht passiert.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Was denkst Du, passiert statt dessen?
terminator
User
Beiträge: 7
Registriert: Mittwoch 20. Oktober 2021, 11:04

Sirius3 hat geschrieben: Mittwoch 20. Oktober 2021, 19:18 Was denkst Du, passiert statt dessen?
Er gibt mir das zweite Listenelement aus (der ersten Zahlen): Also in dem Fall 15.
Was ich jedoch nicht verstehe weil es doch eigentlich das zweite Element sein müsste und somit [1]
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei mir ist die Ausgabe

Code: Alles auswählen

-50
15
also jeweils das erste Element.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@terminator: Nein, es gibt Dir das erste Listenelement aus. Du denkst aber offenbar über die falsche Liste nach, denn es gibt Dir das erste Element von `w1` aus. In jedem Schleifendurchlauf. Also für *jedes* `c`. Für das erste im ersten Schleifendurchlauf, und für das zweite, im zweiten Schleifendurchlauf.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
terminator
User
Beiträge: 7
Registriert: Mittwoch 20. Oktober 2021, 11:04

Sirius3 hat geschrieben: Mittwoch 20. Oktober 2021, 20:15 Bei mir ist die Ausgabe

Code: Alles auswählen

-50
15
also jeweils das erste Element.
Stimmt! Hatte vergessen print(w1[0]) in die For-Schleife einzurücken. Ich habe jedoch keine Ahnung wie ich jetzt die zweiten Zahlen der Listenelemente in eine zusätzliche Liste hineinbekomme.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@terminator: Naja Du musst halt mit dem Index 1 darauf zugreifen. Oder, um diese undurchsichtige Indexhampelei zu vermeiden, das Ergebnis von `split()` an zwei (sinnvolle) Namen aufteilen. Und die kannst Du dann jeweils dafür verwenden um sie an die passende Liste anzuhängen. Die Du vorher erstellen musst, also *vor* dieser Schleife. Und die erste davon darf dann entweder nicht `w1` heissen, oder Du darfst den Namen in dem am Ende alle ersten Elemente landen sollen, nicht in der Schleife für ein Teilergebnis verwenden.

Code: Alles auswählen

In [200]: Liste1 = ['-50 -300' , '15 -70']                                      

In [201]: w1, w2 = map(list, more_itertools.unzip(map(str.split, Liste1)))      

In [202]: w1                                                                    
Out[202]: ['-50', '15']

In [203]: w2                                                                    
Out[203]: ['-300', '-70']
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
terminator
User
Beiträge: 7
Registriert: Mittwoch 20. Oktober 2021, 11:04

__blackjack__ hat geschrieben: Mittwoch 20. Oktober 2021, 22:03 @terminator: Naja Du musst halt mit dem Index 1 darauf zugreifen. Oder, um diese undurchsichtige Indexhampelei zu vermeiden, das Ergebnis von `split()` an zwei (sinnvolle) Namen aufteilen. Und die kannst Du dann jeweils dafür verwenden um sie an die passende Liste anzuhängen. Die Du vorher erstellen musst, also *vor* dieser Schleife. Und die erste davon darf dann entweder nicht `w1` heissen, oder Du darfst den Namen in dem am Ende alle ersten Elemente landen sollen, nicht in der Schleife für ein Teilergebnis verwenden.

Code: Alles auswählen

In [200]: Liste1 = ['-50 -300' , '15 -70']                                      

In [201]: w1, w2 = map(list, more_itertools.unzip(map(str.split, Liste1)))      

In [202]: w1                                                                    
Out[202]: ['-50', '15']

In [203]: w2                                                                    
Out[203]: ['-300', '-70']
Muss ich dafür noch irgend etwas importieren?
Benutzeravatar
Dennis89
User
Beiträge: 1124
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

ja und zwar 'more_itertools'. Dass wäre das hier:
https://more-itertools.readthedocs.io/en/stable/

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Man kann es natürlich auch ohne `more_itertools` schreiben.

Code: Alles auswählen

w1, w2 = map(list, zip(*map(str.split, Liste1)))
Und wenn man die Werte von w1 und w2 nicht unbedingt als Liste braucht, sondern ein Tupel reicht, dann wird es noch simpler.

Code: Alles auswählen

w1, w2 = zip(*map(str.split, Liste1))
terminator
User
Beiträge: 7
Registriert: Mittwoch 20. Oktober 2021, 11:04

Vielen Dank für die ganze Hilfe!
Antworten