2D-Liste

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
Jan.O
User
Beiträge: 61
Registriert: Samstag 26. April 2008, 00:32

Mittwoch 30. April 2008, 21:04

Hi,

was ist der "beste" Weg, eine 2-Dimensionale liste zu erstellen und dann zu kopieren?

Meine aktuelle methode:

Code: Alles auswählen

list= [['' for n in range(0,n)] for n in range(0,n)]

Jan
BlackJack

Mittwoch 30. April 2008, 21:42

Bei Deinem Quelltext kommt das hier heraus:

Code: Alles auswählen

In [50]: n = 5

In [51]: [['' for n in range(0,n)] for n in range(0,n)]
Out[51]: [[], [''], ['', ''], ['', '', ''], ['', '', '', '']]
Man kann das Ergebnis zwar als zweidimensional ansehen, aber irgendwie denke ich, Du meintest etwas anderes. Wenn das innerste Element immer das selbe sein darf:

Code: Alles auswählen

In [54]: [[''] * n for dummy in range(n)]
Out[54]:
[['', '', '', '', ''],
 ['', '', '', '', ''],
 ['', '', '', '', ''],
 ['', '', '', '', ''],
 ['', '', '', '', '']]
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 30. April 2008, 21:43

Entweder

Code: Alles auswählen

from copy import deepcopy
L2 = deepcopy(L1)
oder du benutzt eigene Listen, bei denen du ein copy-on-write implementierst. Das kann je nach Anwendungsfall effizienter sein. Dafür hast du eine Indirektion bei jedem "get", weil Python leider kein "#become:" à la Smalltalk kennt. Ich würde auch darüber nachdenken, statt Listen von Listen nur eine flache Liste zu benutzen. Könnte effizienter sein. Zum Beispiel:

Code: Alles auswählen

class list2d:
  def __init__(self, x, y):
    self.data, self.y = [None] * x * y, y
  def __getitem__(self, (x, y)):
    return self.data[self.y * y + x]
Stefan
Antworten