4 Stimmen

Eine Liste in Python auffüllen

Ich habe eine Reihe von Python-Tupeln, die Koordinaten darstellen:

tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]

Ich möchte die folgende Liste erstellen:

l = []
for t in tuples:
  l[ t[0] ][ t[1] ] = something

Ich erhalte einen IndexError: list index out of range.

Ich kenne mich mit PHP aus und habe erwartet, dass man in Python Listen erstellen kann, die mit einem Index > 0 beginnen, d.h. Lücken bilden und diese dann auffüllen, aber das geht anscheinend nicht.

Die Listen sollen anschließend sortiert werden. Ich weiß, dass ich dies mit einem Wörterbuch tun kann, aber soweit ich weiß, können Wörterbücher nicht nach Schlüsseln sortiert werden. Update : Ich weiß jetzt, dass sie es können - siehe die akzeptierte Lösung.

Bearbeiten: Ich möchte ein 2D-Array erstellen, das die mit den Tupelkoordinaten beschriebene Matrix darstellt, und es dann der Reihe nach durchlaufen. Wenn ich ein Wörterbuch verwenden, habe ich keine Garantie, dass die Iteration über die Schlüssel in der Reihenfolge -> (0,0) (0,1) (0,2) (1,0) (1,1) (1,2) (2,0) (2,1) (2,2)

Kann jemand helfen?

8voto

Rorick Punkte 8697

Nein, Sie können keine Liste mit Lücken erstellen. Aber Sie können ein Wörterbuch mit Tupel-Schlüsseln erstellen:

tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
l = {}
for t in tuples:
    l[t] = something

Aktualisierung: Versuchen Sie es mit NumPy bietet es eine breite Palette von Operationen mit Matrizen und Arrays. Zitiere aus dem kostenlosen pfd über NumPy, das auf der Website verfügbar ist (3.4.3 Flat Iterator indexing): "Wie bereits erwähnt, gibt X.flat einen Iterator zurück, der über das gesamte Array iteriert (in C-Contiguous Style, wobei der letzte Index am schnellsten variiert). . Sieht aus wie das, was Sie brauchen.

6voto

Für so etwas sollten Sie sich Dicts ansehen.

for t in tuples:
  if not l.has_key(t[0]):
    l[t[0]] = {}
  l[t[0]][t[1]] = something

Die Iteration über das Diktat ist jedoch etwas anders als die Iteration über eine Liste. Sie haben die Funktionen keys(), values() und items(), die Ihnen dabei helfen.

EDIT: Versuchen Sie so etwas für die Bestellung:

for x in sorted(l.keys()):
   for y in sorted(l[x].keys()):
       print l[x][y]

3voto

razong Punkte 1269

Sie erstellen eine eindimensionale Liste l und wollen sie als zweidimensionale Liste verwenden. Deshalb erhalten Sie einen Indexfehler.

Sie haben die folgenden Möglichkeiten: Erstellen Sie eine Map und verwenden Sie das Tupel t als Index:

l = {}
l[t] = something

und Sie erhalten Einträge in l wie:

{(1, 1): something}

wenn Sie eine traditionelle Array-Struktur wünschen, empfehle ich Ihnen, sich numpy . Mit numpy erhalten Sie n-dimensionale Arrays mit "traditioneller" Indizierung.

Wie ich bereits erwähnt habe, verwenden Sie numpy,

mit numpy kann man ein 2-dimensionales Array erstellen, gefüllt mit Nullen oder Einsen oder ... Dann können Sie jeden beliebigen Wert mit der Indizierung [x,y] füllen, wie Sie wollen. Natürlich kann man über Zeilen und Spalten oder das gesamte Array als Liste iterieren.

2voto

Wenn Sie die Größe, die Sie vor der Hand wissen, können Sie eine Liste von Listen wie diese machen

>>> x = 3
>>> y = 3
>>> l = [[None] * x for i in range(y)]
>>> l
[[None, None, None], [None, None, None], [None, None, None]]

Diese können Sie dann, wie Sie ursprünglich vorgeschlagen haben, iterieren.

1voto

Rodrigo Punkte 5448

Ausweitung der Nathan die Antwort,

tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
x = max(tuples, key = lambda z : z[0])[0] + 1
y = max(tuples, key = lambda z : z[1])[1] + 1
l = [[None] * y for i in range(x)]

Und dann kannst du tun, was du willst

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