2016-04-24 17 views
0

Ich bin sehr neu in Python und habe seit Tagen versucht, eine Funktion zu schreiben, die ein Feld in meiner Attributtabelle decodiert und den entsprechenden Wert hinzufügt (aus dem Wörterbuch unten) in das leere Feld. (Ähnlich einem vlookup in Excel). Wenn zum Beispiel 'e1' in meiner Attributtabelle auftaucht, suchen Sie im Wörterbuch nach 'e', ​​suchen Sie den entsprechenden Wert im Wörterbuch und drucken Sie ihn in eine Liste und suchen Sie dann '1' und drucken Sie ihn in dieselbe Liste (Leeres Feld wurde bereits zur Attributtabelle hinzugefügt). Fügen Sie diese Liste zu einem leeren Feld in der Attributtabelle hinzu.Python in ArcGIS - Werte in einem Wörterbuch suchen und entsprechenden Wert in ein neues Feld drucken

Antwort

1

Ihre Datenstruktur ist an dieser Stelle nicht Ihr Freund.

Sie haben alle diese Informationen in einer verschachtelten Wörterbuch Struktur gestapelt, aber Sie würden besser dran, es zuerst Decodierung:

#!python3 

import collections 
import itertools 

LUC_dict = { 
    'estu':'Estuaries', 
    'ice':'Ice', 
    'lake':'Lake', 
    'quar':'Quarries/Mines', 
    'rive':'River', 
    'town':'Town/Urban', 
    'Class':{'1':'Arable (1)', 
     '2':'Arable (2)', 
     '3':'Arable (3)', 
     '4':'Arable (4)', 
     '5':'Non Arable (5)', 
     '6':'Non Arable (6)', 
     '7':'Non Arable (7)', 
     '8':'Protected (8)'}, 
    'Subclass':{'c':'Climiate', 
     'e': 'Erosion', 
     's': 'Soil', 
     'w': 'Wetness'}} 

field1_value = {k:v for k,v in LUC_dict.items() if k not in ('Class','Subclass')} 
field2_value = collections.defaultdict(str) 

classes = LUC_dict['Class'] 
subclasses = LUC_dict['Subclass'] 

for c,sc in itertools.product(classes.keys(), subclasses.keys()): 
    field1_value[c+sc] = classes[c] 
    field2_value[c+sc] = subclasses[sc] 


def decode(instr): 
    return field1_value[instr], field2_value[instr] 

tests = "6e 4s rive 2s estu" 

for test in tests.split(): 
    f1, f2 = decode(test) 
    print("{}: [{}, {}]".format(test, f1, f2)) 

Die Ausgabe von dieser wie folgt aussieht:

6e: [Non Arable (6), Erosion] 
4s: [Arable (4), Soil] 
rive: [River, ] 
2s: [Arable (2), Soil] 
estu: [Estuaries, ] 

die ich denke, was du im Sinn hast.

1

Würde dies den Trick machen? Versucht, meine Lösung direkt nach dem Pseudocode zu modellieren.

def decode_LUC(input_string, LUC_dict): # Changed signature to also accept the dict (keep parameter local to function) 
    if not input_string.isalnum(): # Check if alphanumeric 
     raise ValueError("Input string is not alphanumeric!") 
    elif len(input_string) == 2: # Split if we have len 2 
     part1, part2 = input_string[0], input_string[1] # Split into two strings 
     return [LUC_dict["Class"][part1], LUC_dict["Subclass"][part2]] 
    else: # Else try to directly access dict 
     return LUC_dict[input_string] 

LUC_dict = { 
'estu':'Estuaries', 
'ice':'Ice', 
'lake':'Lake', 
'quar':'Quarries/Mines', 
'rive':'River', 
'town':'Town/Urban', 
'Class':{'1':'Arable (1)', 
'2':'Arable (2)', 
'3':'Arable (3)', 
'4':'Arable (4)', 
'5':'Non Arable (5)', 
'6':'Non Arable (6)', 
'7':'Non Arable (7)', 
'8':'Protected (8)'}, 
'Subclass':{'c':'Climiate', 
'e': 'Erosion', 
's': 'Soil', 
'w': 'Wetness'}} 

# If you're in Python3, wrap the print statements with parens 
print decode_LUC("6e", LUC_dict) # Prints ['Non Arable (6)', 'Erosion'] 
print decode_LUC("estu", LUC_dict) # Prints Estuaries 
print decode_LUC("e^", LUC_dict) # Raises a value error