mehrdimensionale Listen

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
Simon_2468
User
Beiträge: 6
Registriert: Dienstag 17. November 2020, 19:04

Moin,
im Rahmen meines Info Labors muss ich ein Algorithmus erstellen, der ein Spiel löst.
Dafür muss ich diese mehrdimensionale Liste auslesen:
[[1, 10, 10, 2], [1, 10, 10, 2], [0, 5, 5, 0], [3, 6, 7, 4], [3, 8, 9, 4]]
Ich suche nach der Position beider Nullen, denn sie repräsentieren Felder die verschoben werden können.
Ich schaffe es leider nur eine Null zu finden, die zweite wird mir nie ausgegeben.
Hat jemand eine Idee wie ich das Problem lösen kann und ich anschließend mit den Werten arbeiten kann?
Dies ist bislang mein Code: (in der start Datei ist die oben genannte Liste)

Code: Alles auswählen

# Datei einlesen
with open("start.txt") as file:
    liste = []
    for line in file:
        if not line.strip(): # <- leere Zeile == keine Daten
            continue
        row = list(map(int,line.split(","))) # Die Zeile beim Komma trennen und die Werte in int umwandeln
        liste.append(row)
print (liste) #Test: Matrix ausgeben

# Null in Liste suchen
def find (l, elem):
    for row, i in enumerate(l):
        try:
            column = i.index(elem)
        except ValueError:
            continue
        return row, column
    return -1
print(find(liste,0))

row = 0
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Simon_2468: Index gibt nur den ersten Index zurück und auch Deine `find()`-Funktion bricht beim ersten gefundenen Ergebnis mit der Rückgabe ab. Du schreibst eine Funktion die nur ein Ergebnis liefert, und die liefert dann halt nur ein Ergebnis.

Du musst eine Funktion schreiben die alle Ergebnisse findet und beispielsweise in einer Liste sammelt und die dann am Schluss, nach der Suche als Ergebnis zurück liefert. Oder Du machst eine Generatorfunktion daraus und überlässt dem Aufrufer die Aufgabe das in einer Liste zu sammeln oder etwas anderes damit zu tun.

In beiden Fällen wirst Du auch gleich diesen falschen -1 Rückgabewert los. Was ist denn das für eine kaputte API, eine Funktion die entweder ein Tupel mit Indexwerten oder eine -1 liefert? `index()` macht es vor: Ausnahmefälle werden mit Ausnahmen beantwortet, nicht mit komischen Sonderspezialwerten auf die kein Mensch kommt.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Simon_2468
User
Beiträge: 6
Registriert: Dienstag 17. November 2020, 19:04

Es ist mein erstes Projekt und bin etwas überfordert mit dem Labor.
Welche Funktion ist in der Lage mir den Wert und die dazugehörige Position anzugeben?
Benutzeravatar
noisefloor
User
Beiträge: 4194
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

überleg' dir mal, wie du das mit Stift und Papier machen würdest: du würdest die äußere Liste Liste für Liste durchgehen und die dadurch erhaltenen inneren Listen Element für Element. Immer, wenn eine Null kommt, schreibst du den Index der äußeren Liste und den Index des Elements auf. Das kann aber auch genau so programmieren.

Listen kennst du, die append-Methode kennst du, `enumerate` kennst du. Das reicht, um das "zu Fuss" zu programmieren.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Simon_2468: Dafür gibt es keine Funktion. Das musst Du selbst programmieren. Das sollte kein Problem sein, denn das machst Du ja bereits für den ersten Index, also den Index der Liste. Genau so musst Du das für den zweiten Index auch machen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten