@JustHechi: Doch den Rückgabewert brauchst Du. Das ist ja genau die verschachtelte Liste beziehungsweise eine flache Liste.
Du solltest nicht mit dem Indexoperator auf die Sudoku-Datenstruktur zugreifen, sondern mit einer Funktion, beziehungsweise zwei Funktionen. Eine um einen Wert von einer gegebenen Koordinate abzufragen und eine um einen Wert an einer gegebenen Koordinate zu setzen. Trenne die (interne) Organisation von der von aussen verwendeten Schnittstelle. Dann kannst Du den inneren Aufbau einfacher ändern.
Vergiss bitte ``global``. Wenn Du das benutzt dann machst Du mit 100%iger Sicherheit etwas falsch. Normalerweise würde ich sagen mit 99,9%tiger Sicherheit, aber Du bist ganz offensichtlich noch nicht weit genug um die 0,1% Ausnahmefälle zu erkennen, also lass es bitte. Lerne wie Funktionen funktionieren.
Wenn Du die „list comprehension”-Syntax nicht kennst, dann lerne sie. Die sollte in jedem vernünftigen Python-Tutorial erklärt werden.
Und könntest Du bitte mal *Satzzeichen* benutzen? Das ist furchtbar schwer zu lesen was Du da ohne Punkt und Komma runterschreibst.
Natürlich kannst Du auch eine Liste mit 81 Elementen benutzen. *Die* richtige Struktur bei der alle erforderlichen Zugriffe der Anordnung der Daten im Speicher entspricht gibt es sowieso nicht. Für die Ausgabe musst Du zeilenweise auf die Daten zugreifen, da ist eine Liste mit Zeilen-Listen einfacher — das sieht man ja auch an meinen Beispiel-Funktionen. Aber im Laufe der weiteren Entwicklung wirst Du auf Spalten und 3×3-Ausschnitte zugreifen müssen, und das gibt keine der beiden Strukturen *direkt* her. Man muss also in jedem Fall Quelltext schreiben der mit Koordinaten Berechnungen anstellt. Eine weitere Möglichkeit wäre ein Wörterbuch zu verwenden welches Tupel mit Koordinaten auf Kästchen abbildet. Die passende Datenstruktur muss nicht das sein was für die Anzeige oder Umwandlung in eine Zeichenkette das praktischste oder direkteste ist, sondern eine die *alle* Operationen berücksichtigt, und gut für die ausgelegt ist, die am häufigsten ausgeführt werden.
Du hast nicht den Spalten und Zeilen Zahlen und Buchstaben gegeben, sondern das hast Du als *Werte* benutzt. Das sind aber nicht die Werte mit denen man bei Sudoku zu tun hat. Die möglichen Werte für ein Kästchen sind „leer” und die Ziffern 0 bis 9, wobei man „leer” wie schon gesagt sinnvoll mit `None` abbilden kann. Etwas wie ``A2`` ist kein gültiger Wert für ein Kästchen. Das kann man als Koordinatenangabe verwenden, aber die Koordinaten speichert man nicht in einer Listenstruktur. Dort sind dir Koordinaten implizit in der Datenstruktur enthalten. Wenn man das Sudoku als Wörterbuch mit Koordinaten als Schlüssel speichert, *dann* speichert man auch die Koordinaten in der Datenstruktur.
Der Sinn der `cross()`-Funktion erschliesst sich mir deshalb immer noch nicht. Zumal die auch fehlerhaft und „unpythonisch” geschrieben ist.
Die Argumente `lst1` und `lst2` hbn ncht nr schlcht Nmn (so Scheisse liest sich das wenn man anfängt Vokale wegzulassen), sondern werden innerhalb der Funktion gar nicht verwendet. Die Argumente wegzulassen wäre übrigens die falsche Lösung an der Stelle.
Man iteriert in Python nicht über Indexzahlen um damit dann nur auf Sequenzen zuzugreifen. Man kann *direkt* über die Elemente der Sequenzen iterieren. Mit „list comprehension(s)” ist das ganze ein Zweizeiler:
Code: Alles auswählen
def cross(sequence_a, sequence_b):
return [['{0}{1}'.format(a, b) for b in sequence_b] for a in sequence_a]
Bei `print_()` fehlt das Argument `matrix` weil Werte Funktionen als Argumente betreten sollten und nicht einfach so magisch aus dem Modulnamensraum kommen sollten.
Die einbuchstabigen Namen sind schlecht, weil nichtssagend. Für alles was kein Index ist oder nur in einem sehr beschränkten Gültigkeitsbereich („comprehensions”, Generatorausdrücke, ``lambda``-Ausdrücke) verwendet wird, sind einbuchstabige Namen nicht aussagekräftig genug.
Wenn man zusätzlich zu den Elementen eines iterierbaren Objekts auch noch einen Laufindex braucht, sollte man den nicht manuell verwalten, sondern die `enumerate()`-Funktion verwenden.
`t` wird an *zwei* ungünstigen Stellen an die leere Zeichenkette gebunden statt nur an *einer* günstigeren Stelle.