Seite 1 von 1

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

Verfasst: Freitag 10. Juli 2009, 21:11
von MatthiasV
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.

Re: Warum präferiert Py andere Konstrukte als mehrdim. Array

Verfasst: Freitag 10. Juli 2009, 21:16
von 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?

Verfasst: Freitag 10. Juli 2009, 22:19
von MatthiasV
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:

Verfasst: Freitag 10. Juli 2009, 22:46
von cofi

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.

Verfasst: Freitag 10. Juli 2009, 23:15
von 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

Verfasst: Samstag 11. Juli 2009, 00:04
von Darii
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.