Im angehängten Screenshot enthalten die Attribute zwei interessierende Felder "a" und "b". Ich möchte ein Skript schreiben, um auf die benachbarten Zeilen zuzugreifen und einige Berechnungen durchzuführen. Um auf eine einzelne Zeile zuzugreifen, würde ich den folgenden UpdateCursor verwenden:
fc = r'C:\path\to\fc'
with arcpy.da.UpdateCursor(fc, ["a", "b"]) as cursor:
for row in cursor:
# Do something
Zum Beispiel möchte ich mit OBJECTID 4 die Summe der Zeilenwerte im Feld "a" neben der Zeile OBJECTID 4 (dh 1 + 3) berechnen und diesen Wert zur Zeile OBJECTID 4 im Feld "b" hinzufügen. Wie kann ich mit dem Cursor auf benachbarte Zeilen zugreifen, um diese Art von Berechnungen durchzuführen?
quelle
OBJECTID
- kann diese Lösung Nachbarn anhand der Werte dieses Schlüssels zuverlässig identifizieren. Wörterbücher unterstützen jedoch normalerweise keine "nächste" oder "vorherige" Suche. Du brauchst so etwas wie einen Trie .Während Sie die Zeilen durchlaufen, müssen Sie die vorherigen Werte verfolgen. Dies ist eine Möglichkeit, dies zu tun:
oder, wenn die Tabelle nicht riesig ist, würde ich wahrscheinlich ein Wörterbuch wie d = {a: b} erstellen und dann im Update-Cursor auf Daten aus dem Wörterbuch zugreifen: d.get (a + 1) oder d.get (a -1) um zu rechnen ..
quelle
Ich habe die Antwort von @Hornbydd akzeptiert, weil sie mich zu einer Wörterbuchlösung geführt hat. Das angehängte Skript führt die folgenden Aktionen aus:
quelle
Das Datenzugriffsmodul ist recht schnell und Sie können ein erstellen
SearchCursor
, um alle Werte von 'a' in einer Liste zu speichern. Erstellen Sie dann einUpdateCursor
, um jede Zeile zu durchlaufen, und wählen Sie aus der Liste aus, um die erforderlichen 'b'-Zeilen zu aktualisieren. Auf diese Weise müssen Sie sich keine Gedanken über das Speichern von Daten zwischen Zeilen machen =)Also so etwas wie das:
Dies ist eine ziemlich grobe Lösung, aber ich habe sie erst kürzlich verwendet, um ein sehr ähnliches Problem zu umgehen. Wenn der Code hoffentlich nicht funktioniert, sind Sie auf dem richtigen Weg!
Edit: Letzte if-Anweisung von AND nach OR geändert. Edit2: Zurück geändert. Ahh der Druck von meinem ersten StackExchange-Beitrag!
quelle
aList
anstatt jeden Eintrag anzuhängen. 2) Verwenden Sieenumerate()
anstelle eines separaten Zählers für den Index.Zuerst benötigen Sie einen Suchcursor. Ich glaube nicht, dass Sie mit einem Update-Cursor Werte erhalten können. Verwenden Sie dann in jeder Iteration aNext = row.next (). GetValue ('a'), um den Wert der nächsten Zeile abzurufen.
Um den Wert der vorherigen Zeile zu erhalten, würde ich eine Variable außerhalb der for-Schleife gleich Null einrichten. Dies wird aktualisiert, um dem aktuellen Zeilenwert von 'a' zu entsprechen. Sie können dann in der nächsten Iteration auf diese Variable zugreifen.
Dies würde dann Ihre Gleichung von B = A (Zeilen-ID-1) + A (Zeilen-ID + 1) erfüllen.
quelle
fieldA
und einen neuen Wert für zu berechnenfieldB
.)