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

2D-Liste

Beitragvon Jan.O » 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=]list= [['' for n in range(0,n)] for n in range(0,n)]
[/code]


Jan
BlackJack

Beitragvon 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

Beitragvon sma » 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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], Yahoo [Bot]