5 Stimmen

Wie erstellt man verschachtelte Listen in Python?

Ich weiß, dass man in Python leicht verschachtelte Listen wie diese erstellen kann:

[[1,2],[3,4]]

Aber wie erstellt man eine 3x3x3-Matrix aus Nullen?

[[[0] * 3 for i in range(0, 3)] for j in range (0,3)]

ou

[[[0]*3]*3]*3

Das scheint nicht richtig zu sein. Gibt es keine Möglichkeit, eine Liste von Dimensionen an eine Methode zu übergeben? Beispiel:

CreateArray([3,3,3])

9voto

Falls Sie tatsächlich nach einer Matrix suchen, sollten Sie das numpy-Paket in Betracht ziehen.

http://docs.scipy.org/doc/numpy/reference/generated/numpy.zeros.html#numpy.zeros

So erhalten Sie eine 3x3x3 Anordnung von Nullen:

numpy.zeros((3,3,3)) 

Außerdem profitieren Sie von den praktischen Funktionen eines Moduls, das für das wissenschaftliche Rechnen entwickelt wurde.

1voto

Jader Dias Punkte 84120

NumPy löst dieses Problem

http://www.scipy.org/Tentative_NumPy_Tutorial#head-d3f8e5fe9b903f3c3b2a5c0dfceb60d71602cf93

>>> a = array( [2,3,4] )
>>> a
array([2, 3, 4])
>>> type(a)
<type 'numpy.ndarray'>

Wenn Sie jedoch die nativen Python-Listen als Matrix verwenden möchten, können die folgenden Hilfsmethoden nützlich sein:

import copy

def Create(dimensions, item):
    for dimension in dimensions:
        item = map(copy.copy, [item] * dimension)
    return item
def Get(matrix, position):
    for index in position:
        matrix = matrix[index]
    return matrix
def Set(matrix, position, value):
    for index in position[:-1]:
        matrix = matrix[index]
    matrix[position[-1]] = value

1voto

rob Punkte 35132

List comprehensions sind nur syntaktischer Zucker, um der Listeninitialisierung mehr Ausdruckskraft zu verleihen; in Ihrem Fall würde ich sie überhaupt nicht verwenden und mich für eine einfache verschachtelte Schleife entscheiden.

Auf einer ganz anderen Ebene: denken Sie, dass die n-dimensionales Array von NumPy ein besserer Ansatz sein könnte?
Obwohl man Listen verwenden kann, um mehrdimensionale Matrizen zu implementieren, sind sie meiner Meinung nach nicht das beste Werkzeug für dieses Ziel.

0voto

Sander Evers Punkte 1

Oder verwenden Sie die Funktion nest, die wie folgt definiert ist aquí in Kombination mit repeat(0) aus dem Modul itertools:

nest(itertools.repeat(0),[3,3,3])

-3voto

Dario Punkte 47246

Einfach die Multiplikationssyntax verschachteln:

[[[0] * 3] * 3] * 3

Es ist daher einfach, diesen Vorgang mit faltet

def zeros(dimensions):
    return reduce(lambda x, d: [x] * d, [0] + dimensions)

Oder wenn Sie eine Referenzreplikation vermeiden wollen, so dass sich die Änderung eines Elements nicht auf andere auswirkt, sollten Sie stattdessen Kopien verwenden:

import copy
def zeros(dimensions):
    item = 0
    for dimension in dimensions:
        item = map(copy.copy, [item] * dimension)
   return item

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X