Warum präferiert Py andere Konstrukte als mehrdim. Arrays?

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
MatthiasV
User
Beiträge: 2
Registriert: Samstag 7. Juni 2008, 07:57
Wohnort: 49681 Garrel

Moin,
ich bin "Wiedereinsteiger" in die Programmierung und will mir Python und Groovy näher ansehen. Dazu wollte ich meinen eigenen Sudokulöser erstellen (auch wenn es den schon x-fach gibt).
Ich bin da recht schnell mit mehrdimensionalen Arrays gescheitert, obwohl in Java und auch Groovy ein sudoku[][] durchaus machbar ist.

Warum werden in Python mehrdimensionale Arrays als suboptimale Lösung angesehen? Mir fehlt eine griffige Erklärung... Danke schon mal.
lunar

MatthiasV hat geschrieben:Ich bin da recht schnell mit mehrdimensionalen Arrays gescheitert
Und woran genau? Ein "sudoku[][]" geht auch in Python ...
Warum werden in Python mehrdimensionale Arrays als suboptimale Lösung angesehen?
Wo hast du das her?
MatthiasV
User
Beiträge: 2
Registriert: Samstag 7. Juni 2008, 07:57
Wohnort: 49681 Garrel

Google genutzt, Seiten aber nicht gespeichert. Bin u. a. auf eine Sudokusolver-Lösung gestoßen von Peter Norvig, sowie andere, und *keine* davon hat ein mehrdim. Array genutzt. Daher meine Vermutung.

Beim Versuch, ein mehrdimensionales Array zu definieren, bin ich zum Schluss dabei angekommen, etwas wie

Code: Alles auswählen

Zeile=[None]*maxindex
sudoku = [[None] * maxindex] * maxindex
zu schreiben (die Lösung sollte auch "Hexadokus" usw. lösen können, vgl. Zeitschrift Elektor). Das waren zwar auch die wirklich ersten Übungen, aber ich habe das Gefühl, es ist zu unelegant... :wink:
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

In [2]: maxindex = 9

In [3]: sudoku = [[None for i in xrange(maxindex)] for i in xrange(maxindex)]

In [4]: sudoku
Out[4]:
[[None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None]]

In [5]: sudoku[0][1] = 1

In [6]: sudoku
Out[6]:
[[None, 1, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None]]
Ich habe mich mit Sudokus nicht so recht beschaeftigt, aber eventuell waere der Ansatz, bei dem ein Feld weiss, in welcher Spalte und Zeile es ist ganz hilfreich => ``class field`` oder auch ``named_tuple`` usw.
BlackJack

@MatthiasV: Das Programmierer für ein bestimmtes Problem keine "mehrdimensionalen Arrays" verwenden heisst ja noch nicht zwangsläufig, dass das an der Programmiersprache liegt. Es kann ja auch an den Programmierern und dem zu lösenden Problem liegen.

Ich hab sudokulösen mit "2D-Listen" gemacht: http://www.python-forum.de/post-19685.html#19685
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

MatthiasV hat geschrieben:Beim Versuch, ein mehrdimensionales Array zu definieren, bin ich zum Schluss dabei angekommen, etwas wie

Code: Alles auswählen

Zeile=[None]*maxindex
sudoku = [[None] * maxindex] * maxindex
zu schreiben (die Lösung sollte auch "Hexadokus" usw. lösen können, vgl. Zeitschrift Elektor). Das waren zwar auch die wirklich ersten Übungen, aber ich habe das Gefühl, es ist zu unelegant... :wink:
Vor allem auch falsch.

Code: Alles auswählen

In [1]: liste = [[0]*2] * 2

In [2]: liste[0][0] = 1

In [3]: print liste
[[1, 0], [1, 0]]
Die Objekte in der Liste, die du multiplizierst, werden nämlich nicht kopiert, sondern nur die Referenzen darauf.

Verpönt sind mehrdimensionale Arrays in Python keineswegs, es gibt bloß keine (array.array ist nur 1D). *SCNR* ;) Es gibt mit numpy.ndarray übrigens durchaus eine leistungsfähige Klasse für mehrdimensionale Arrays.
Antworten