Seite 1 von 1

2D-Liste

Verfasst: Mittwoch 30. April 2008, 21:04
von Jan.O
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

Verfasst: Mittwoch 30. April 2008, 21:42
von BlackJack
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]:
[['', '', '', '', ''],
 ['', '', '', '', ''],
 ['', '', '', '', ''],
 ['', '', '', '', ''],
 ['', '', '', '', '']]

Verfasst: Mittwoch 30. April 2008, 21:43
von sma
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