Frage

Ich habe eine Reihe von Python-Tupel darstellen, Koordinaten:

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

Ich mag die folgende Liste erstellen:

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

Ich erhalte einen Indexerror: Listenindex außerhalb des zulässigen Bereichs

.

Mein Hintergrund ist in PHP und ich erwartete, dass in Python Sie Listen erstellen können, die mit dem Index Start> 0, das heißt Lücken machen und sie dann füllen, aber es scheint, kann man nicht.

Die Idee ist, die Listen danach sortiert haben. Ich weiß, ich kann mit einem Wörterbuch dies tun, aber soweit ich weiß, Wörterbücher kann nicht durch Tasten sortiert werden. Aktualisieren . Ich weiß jetzt, sie können - die akzeptierte Lösung sehen

Edit: Was ich tun möchte, ist ein 2D-Array zu erstellen, die die Matrix mit den Tupel-Koordinaten beschrieben darstellen, wiederholen sie dann um. Wenn ich ein Wörterbuch verwenden, ich habe keine Garantie, dass in dem Schlüssel überläuft, um sein -> (0,0) (0,1) (0,2) (1,0) (1,1) (1,2 ) (2,0) (2,1) (2,2)

Kann mir jemand helfen?

War es hilfreich?

Lösung

Was meinst du genau mit „aber soweit ich weiß, Wörterbücher kann nicht durch Tasten sortiert werden“?

Dies ist zwar nicht unbedingt das gleiche wie ein „sortierten Wörterbuch“ ist, können Sie können leicht ein Wörterbuch in eine Liste drehen, nach dem Schlüssel sortiert, was zu sein scheint, was Sie nach:

>>> tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
>>> l = {}
>>> for t in tuples:
...    l[t] = "something"
>>> sorted(l) # equivalent to sorted(l.keys())
[(0, 0), (0, 1), (1, 0), (1, 1), (2, 1)]
>>> sorted(l.items()) # make a list of (key, value) tuples, and sort by key
[((0, 0), 'something'), ((0, 1), 'something'), ((1, 0), 'something'), ((1, 1), 'something'), ((2, 1), 'something')]    

(Ich drehte something in den String "etwas" nur den Code Arbeit zu machen)

Um die Verwendung dieser für Ihren Fall machen jedoch (wenn ich es richtig verstehe, das ist), würden Sie noch das Wörterbuch mit keine Werte oder etwas für jeden „leeren“ Koordinatentupel ausfüllen müssen)

Andere Tipps

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

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

Update: Versuchen Sie es mit NumPy , es bietet breite Palette von Operationen über Matrizen und Arrays. Zitieren von freien pfd auf NumPy auf der Website (3.4.3 Wohnung Iterator Indizierung): "Wie bereits erwähnt, X.flat gibt einen Iterator, die über das gesamte Array (in C-zusammenhängendem Stil mit dem letzten Index laufen werden Variieren der schnellsten ". Sieht aus wie das, was Sie brauchen.

Sie sollten bei dicts für so etwas aussehen.

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

Iterieren über die dict ist ein bisschen anders als über eine Liste iterieren, though. Hier finden Sie die Tasten (), Werte () und Positionen () Funktionen mit dabei zu helfen.

EDIT: versuchen, so etwas wie dies für die Bestellung:

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

Sie erstellen eine eindimensionale Liste l und wollen es als eine zweidimensionale Liste verwenden. warum Sie, das ist ein Index-Fehler.

Sie haben folgende Möglichkeiten: eine Karte erstellen und das Tupel t als Index verwenden:

l = {}
l[t] = something

und Sie werden Einträge in l erhalten, wie:

{(1, 1): something}

Wenn Sie eine traditionelle Feldstruktur will ich werde beraten Sie unter numpy . Mit numpy erhalten Sie n-dimensionale Arrays mit "traditioneller" Indizierung.

Wie ich Verwendung numpy erwähnt,

mit numpy Sie einen 2-dimensionalen Array erstellen können, gefüllt mit Nullen oder Einsen oder ... Tha können Sie einen beliebigen gewünschten Wert mit Indexierung füllen [x, y], wie Sie wünschen. Natürlich können Sie sich über Zeilen und Spalten oder das gesamte Array als Liste iterieren.

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

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

, die Sie dann iterieren wie ursprünglich vorgeschlagen.

Die Ausweitung der Nathan 's 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 können Sie tun, was Sie wollen

Wie bereits erwähnt, können Sie keine Listen mit Lücken machen und Wörterbücher können die bessere Wahl hier. Der Trick ist, stellt sicher, dass l[t[0]] liegt vor, wenn Sie etwas in Position t[1] setzen. Dazu würde ich ein defaultdict .

import collections
tuples = [(1,1), (0,1), (1,0), (0,0), (2,1)]
l = collections.defaultdict(dict)
for t in tuples:
    l[t[0]][t[1]] = something

Da l ist ein defaultdict, wenn l[t[0]] nicht vorhanden ist, wird es eine leere dict erstellen für Sie Ihre something in t[1] in Position zu bringen.

Hinweis: das gleiche ist wie @ unwesen Antwort, ohne die kleinen Langwierigkeit von Hand überprüft die Existenz des inneren dict diese endet. Chalk es gleichzeitige Beantwortung auf.

Die dict Lösungen gegeben sind wahrscheinlich am besten für die meisten Zwecke. Für Ihre Frage über die Tasten in der Reihenfolge der Iteration, in der Regel würden Sie stattdessen iterieren den Koordinatenraum , nicht die dict Tasten, genau die gleiche Art und Weisen Sie Ihre Liste von Listen haben würden. Verwenden Sie .get und Sie können den Standardwert angeben, für die leeren Zellen zu verwenden, oder alternativ verwenden „collections.defaultdict“, um eine Standard bei dict Erstellungszeit zu definieren. zB.

for y in range(10):
    for x in range(10):
        value = mydict.get((x,y), some_default_value)
        # or just "value = mydict[x,y]" if used defaultdict

Wenn Sie eine aktuelle Liste von Listen benötigen, können Sie es direkt konstruieren wie folgt:

max_x, max_y = map(max, zip(*tuples))
l=[[something if (x,y) in tuples else 0 for y in range(max_y+1)] 
     for x in xrange(max_x+1)]

Wenn die Liste von Tupeln wahrscheinlich ist lang, die aus Performance-Gründen, können Sie einen Satz für die Suche verwendet werden soll, als „(x,y) in tuples“ führt eine Abtastung der Liste, anstatt einen schnellen Nachschlagen von Hash. dh, ändern Sie die zweite Zeile:

tuple_set = set(tuples)
l=[[something if (x,y) in tuple_set else 0 for y in range(max_y+1)] 
     for x in xrange(max_x+1)]

Ich glaube, Sie haben nur eine eindimensionale Liste deklariert.

Ich glaube, Sie es als

erklären
l = [][]

Bearbeiten : Das ist ein Syntaxfehler

>>> l = [][]
  File "<stdin>", line 1
    l = [][]
           ^
SyntaxError: invalid syntax
>>> 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top