Mehrdimensionle Liste, for Schleife Index?

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
Fiffio
User
Beiträge: 33
Registriert: Donnerstag 21. Februar 2019, 21:20

Dienstag 19. März 2019, 00:06

Hallo,

ich will z.B. auf das zweite Element jeder Liste zugreifen.

Code: Alles auswählen

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for liste in a:
    for element in liste[?][1]:                      # wie die Listen durchlaufen?
        print("element",element)
element 2
element 5
element 8
Ich schaffe es aber nur "alle" Elemente der Listen auszugeben.

Code: Alles auswählen

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for liste in a:
    for element in liste:
        print("element",element)
element 1
element 2
element 3
element 4
element 5
element 6
element 7
element 8
element 9
Mit meiner Anfängerlogik würde ich das mit liste[[ i ][ 1 ]] machen:

Code: Alles auswählen

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
i = 0
for liste in a:
    i = i+1
    for element in liste[[i][1]]:
        print("Elemente aus Index 1:",element)
        
    for element in liste[[i][1]]:

IndexError: list index out of range
Mit den Beiträgen zu "IndexError: list index out of range" im Netz, komme ich bis jetzt nicht weiter.
Benutzeravatar
__blackjack__
User
Beiträge: 2764
Registriert: Samstag 2. Juni 2018, 10:21

Dienstag 19. März 2019, 00:13

@Fiffio: Auf das zweite Element einer Liste greift man mit dem Index 1 zu. Da braucht man keine ``for``-Schleife zu.
“All tribal myths are true, for a given value of 'true'.” – Terry Pratchett, The Last Continent
Fiffio
User
Beiträge: 33
Registriert: Donnerstag 21. Februar 2019, 21:20

Dienstag 19. März 2019, 00:55

@__blackjack__
Bei einer einzigen Liste verstehe ich das aber wie bei einer mehrdimensionale Liste? Ich will ja die verschiedenen Listen automatisch durchlaufen lassen. Mit

Code: Alles auswählen

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(a[0][1])
2
Und wie bekommt man automatisch Index 1 von Liste Nr.2 usw.?
Fiffio
User
Beiträge: 33
Registriert: Donnerstag 21. Februar 2019, 21:20

Dienstag 19. März 2019, 01:20

Hab was gefunden: https://stackoverflow.com/a/52615043

Code: Alles auswählen

l = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
l_len = len(l)
l_item_len = len(l[0])
for i in range(l_len):
    for j in range(l_item_len):
        print(f'List[{i}][{j}] : {l[i][j]}'  )
        
List[0][0] : 1
List[0][1] : 2
List[0][2] : 3
List[1][0] : 4
List[1][1] : 5
List[1][2] : 6
List[2][0] : 7
List[2][1] : 8
List[2][2] : 9
List[3][0] : 10
List[3][1] : 11
List[3][2] : 12        
Das muss ich nur noch verstehen. Wie bekommt man nur?
List[0][1] : 2
List[1][1] : 5
List[2][1] : 8
List[3][1] : 11
Benutzeravatar
kbr
User
Beiträge: 1003
Registriert: Mittwoch 15. Oktober 2008, 09:27

Dienstag 19. März 2019, 05:11

Ach du liebe Güte,. Ein prima Beispiel, dass auch auf stackoverflow übler Code zu finden ist.
Nimm Deine ursprüngliche Liste a und schreibe:

Code: Alles auswählen

for item in a:
    print(item)
Dann siehst Du recht schnell, was Du statt "print(item)" schreiben musst, um das jeweils zweite Element der Listen in a auszugeben.
Sirius3
User
Beiträge: 9529
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 19. März 2019, 07:39

@kbr: In stackoverflow kann auch jeder fast alles schreiben, man wird nur schnell abgewertet und die Antwort mit den meisten Votes ist ja auch in Ordnung.

@Fiffio: Programmieren heißt auch, ein großes Problem in mehrere einfache Teilprobleme zu zerlegen, von denen man die Lösung schon kennt. Du hast zwei Teilprobleme:
1. das zweite Element einer Liste ausgeben
2. mit jeder Liste, die wiederum in einer Liste steckt, das selbe machen.

Für beide Teilprobleme hast Du hier schon die Lösung gezeigt, jetzt mußt Du sie nur noch kombinieren.
Fiffio
User
Beiträge: 33
Registriert: Donnerstag 21. Februar 2019, 21:20

Dienstag 19. März 2019, 11:32

Soweit komme ich jeweils an alle Listen und alle Elemente:

Code: Alles auswählen

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for listeX in a:
    print("Einzelne Liste:",listeX)
    for elementX in listeX:
#        if listeX[][]
        print("Element:",elementX)
#        print(elementX[1][2])

Einzelne Liste: [1, 2, 3]
Element: 1
Element: 2
Element: 3
Einzelne Liste: [4, 5, 6]
Element: 4
Element: 5
Element: 6
Einzelne Liste: [7, 8, 9]
Element: 7
Element: 8
Element: 9
Aber bei der Frage, wie bekommt man nur das jeweils zweite Element? Steh ich wieder wie der Ochs vorm Berg.
Benutzeravatar
__blackjack__
User
Beiträge: 2764
Registriert: Samstag 2. Juni 2018, 10:21

Dienstag 19. März 2019, 12:16

@Fiffio: Du greifst einfach auf das zweite Element zu. Ohne eine Schleife, die braucht man dafür nicht. Stellen wir uns mal vor Du hast eine Liste die `listeX` heisst und Du willst das zweite Element ausgeben, und *nur* das, wie machst Du das?
“All tribal myths are true, for a given value of 'true'.” – Terry Pratchett, The Last Continent
Fiffio
User
Beiträge: 33
Registriert: Donnerstag 21. Februar 2019, 21:20

Dienstag 19. März 2019, 12:52

__blackjack__ hat geschrieben:
Dienstag 19. März 2019, 12:16
@Fiffio: Du greifst einfach auf das zweite Element zu. ... wie machst Du das?
Bei einer einfachen Liste mit Element-Index = 1 so:

Code: Alles auswählen

listeX = [1, 2, 3]
print("Elemente von listeX:",listeX[1])

Elemente von listeX: 2
Bei einer verschachtelten Liste mit Listen-Index = 0 und Element-Index = 1:

Code: Alles auswählen

listeY = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print("Elemente von listeY:",listeY[0][1])

Elemente von listeY: 2
Und jetzt habe ich ja alles mögliche probiert, wie man diese [x][1] Listen-Position durchlaufen lassen könnte, damit ich von allen Listen das zweite Element bekomme. Warum wird das nirgends einfach beschrieben? Der Profi scheint verschachtelten Listen mit NymPy zu machen...
randomuser
User
Beiträge: 9
Registriert: Donnerstag 21. Februar 2019, 09:58

Dienstag 19. März 2019, 13:04

Fiffio hat geschrieben:
Dienstag 19. März 2019, 12:52
Warum wird das nirgends einfach beschrieben?
Ein sehr guter Hinweis wurde dir doch schon gegeben, hast du aber geschickt ignoriert. Also hier nochmal ;-)
kbr hat geschrieben:
Dienstag 19. März 2019, 05:11
Nimm Deine ursprüngliche Liste a und schreibe:

Code: Alles auswählen

for item in a:
    print(item)
Dann siehst Du recht schnell, was Du statt "print(item)" schreiben musst, um das jeweils zweite Element der Listen in a auszugeben.
Benutzeravatar
__blackjack__
User
Beiträge: 2764
Registriert: Samstag 2. Juni 2018, 10:21

Dienstag 19. März 2019, 13:09

@Fiffio: Dein Problem ist das Du immer noch an eine verschachtelte Liste denkst, dabei hast Du die *in* der äusseren Schleife gar nicht mehr. Du hast eine Schleife über die Elemente von der äusseren Liste. Und diese Elemente sind einfache, unverschachtelte Listen. Und zwar in jedem Schleifendurchlauf genau *eine* davon. Und auf das zweite Element *einer* Liste greift man ganz einfach mit `liste[1]` zu. Da brauchst Du weder eine Schleife noch irgendwie *noch* einen Index `x`. Du denkst Du müsstest da irgend etwas tun, was Du nicht musst.
“All tribal myths are true, for a given value of 'true'.” – Terry Pratchett, The Last Continent
Fiffio
User
Beiträge: 33
Registriert: Donnerstag 21. Februar 2019, 21:20

Dienstag 19. März 2019, 13:29

Ja so geht es. Diese Lösung hatte ich aber eigentlich gestern schon mal probier:

Code: Alles auswählen

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for item in a:
    print("Zweites Element der Listen in a:",item[1])
    
Zweites Element der Listen in a: 2
Zweites Element der Listen in a: 5
Zweites Element der Listen in a: 8
und bilde mir ein, dass immer solche Meldungen kamen:

Code: Alles auswählen

TypeError: 'int' object is not subscriptable
Besten Dank. Dann war es doch nicht wirklich (nur) meine "Dyskalkulie". :?
Benutzeravatar
DeaD_EyE
User
Beiträge: 292
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Dienstag 19. März 2019, 16:13

Wenn man jedes zweite Element anders interpretiert, ist der Gedanke an eine verschachtelte for-schleife nicht ganz falsch, aber trotzdem umständlich.
Nicht das zweite Element, sondern jedes zweite Element.

Code: Alles auswählen

a = [[1, 2, 3,10,20,30], [4, 5, 6,40,50,60], [7, 8, 9,70,80,90]]
for elements in a:
    print(elements[1::2])
[2, 10, 30]
[5, 40, 60]
[8, 70, 90]
Das gleiche nochmal so ähnlich, aber zu umständlich.

Code: Alles auswählen

a = [[1, 2, 3,10,20,30], [4, 5, 6,40,50,60], [7, 8, 9,70,80,90]]
for elements in a:
    for index, subelement in enumerate(elements, start=1):
        if index % 2 == 0:
            print(subelement, end=" ")
    print() 
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten