2016-04-24 14 views
0

私は非常にPythonに慣れ親しんでいました。私の属性テーブルのフィールドをデコードし、対応する値を追加する関数(下の辞書から)空白のフィールドに入力します。 (Excelのvlookupに似ています)。たとえば、 'e1'が自分の属性テーブルに現れると、辞書の中の 'e'を検索し、辞書に対応する値を見つけてそれをリストに出力し、 '1'を検索して同じリストに出力しますブランクフィールドは既に属性テーブルに追加されています)。次に、このリストを属性テーブルの空白のフィールドに追加します。ArcGISのPython - 辞書の値を検索し、対応する値を新しいフィールドに出力する

答えて

1

この時点であなたのデータ構造はあなたの友人ではありません。

あなたは、ネストされた辞書構造に積み上げ、このすべての情報を持っているが、あなたが最初にそれをデコードしたほうが良いでしょう:

#!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)) 

これからの出力は次のようになります。

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

あなたが念頭に置いていることを考えてください。

1

これはトリックですか?分かりやすくするために、擬似コードの直後に私のソリューションをモデル化しようとしました。

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 
関連する問題