2015-03-02 100 views
0

我正在創建預處理Landsat衛星圖像的自動腳本。該腳本通過查找校正係數的元數據文本文件進行解析。已經有含有一些處理圖像,取決於衛星和傳感器所收集的圖像所需要的係數的6周現有的字典(類似於下面):Python將字符串轉換爲現有字典名稱以添加鍵值對

TM5 = {'ESUN1':1983,'ESUN2':1796,'ESUN3':1536} #Landsat5 Thematic Mapper 
ETM7 = {'ESUN1':1997,'ESUN2':1812,'ESUN3':1533} #Landsat7 Enhanced Thematic Mapper 

字典名稱對應於衛星和傳感器。由於腳本解析通過txt文件,創建這些變量:

sat = 'ETM7' # sat/sensor, also the name of a dict 
key = 'LMIN1' 
val = -1.520 

基礎上sat變量,我希望能夠到一個新的鍵/值對添加到字典正確(在這種情況下, ETM7字典)。然而,當我這樣做

sat[key] = val 

我得到這個錯誤

Traceback (most recent call last): 
    File "<pyshell#36>", line 1, in <module> 
    sat[key] = val 
TypeError: 'str' object does not support item assignment 

我明白了什麼錯誤意思,但我不知道怎麼pythonically說,這個字符串變量實際上是現有的名稱字典,所以添加這個鍵/ val對而不必完全重新創建/覆蓋現有字典。有沒有辦法做到這一點?提前致謝!

+0

字符串是一個字符串,即使它包含的字符也是變量的名稱。這就是爲什麼字符串在它們周圍有引號,而變量名不能。 – Sam 2015-03-02 16:26:13

+0

您需要直接調用字典名稱,而不是通過變量。 – 2015-03-02 16:26:51

回答

0

如果您確實想使用包含其名稱的字符串來引用字典,請使用eval(sat)[key]而不是sat[key]

+1

我不認爲推薦在任意輸入時使用'eval'是一個好主意,當有些不同但更安全的選項時。 – Joe 2015-03-02 16:44:08

0

選項是創建映射記錄現有字典。

限制:無法在映射中創建新字典。

演示:

TM5 = {'ESUN1':1983,'ESUN2':1796,'ESUN3':1536} 
ETM7 = {'ESUN1':1997,'ESUN2':1812,'ESUN3':1533} 

manpping = {"ETM7":ETM7, "TM5":TM5} 

sat = 'ETM7' 
key = 'LMIN1' 
val = -1.520 

if sat in manpping: 
    manpping[sat][key] = val 

print "ETM7:", ETM7 

輸出:

$ python task4.py 
ETM7: {'ESUN2': 1812, 'ESUN3': 1533, 'ESUN1': 1997, 'LMIN1': -1.52} 

創建了新的密鑰信息映射新字典。

演示:

import pprint 

TM5 = {'ESUN1':1983,'ESUN2':1796,'ESUN3':1536} 
ETM7 = {'ESUN1':1997,'ESUN2':1812,'ESUN3':1533} 

manpping = {"ETM7":ETM7, "TM5":TM5} 

sat = 'ETM7' 
key = 'LMIN1' 
val = -1.520 

if not sat in manpping: 
    manpping[sat] = {} 

manpping[sat][key] = val 

print "mmaping value:" 
pprint.pprint(manpping) 
print "ETM7:" 
pprint.pprint(ETM7) 

#- No maaping present. 
print "\nNo maaping present." 
sat = 'ATM5' 
key = 'ATM' 
val = 1.520 

if not sat in manpping: 
    manpping[sat] = {} 

manpping[sat][key] = val 

print "mmaping value:" 
pprint.pprint(manpping) 

輸出:

mmaping value: 
{'ETM7': {'ESUN1': 1997, 'ESUN2': 1812, 'ESUN3': 1533, 'LMIN1': -1.52}, 
'TM5': {'ESUN1': 1983, 'ESUN2': 1796, 'ESUN3': 1536}} 
ETM7: 
{'ESUN1': 1997, 'ESUN2': 1812, 'ESUN3': 1533, 'LMIN1': -1.52} 

No maaping present. 
mmaping value: 
{'ATM5': {'ATM': 1.52}, 
'ETM7': {'ESUN1': 1997, 'ESUN2': 1812, 'ESUN3': 1533, 'LMIN1': -1.52}, 
'TM5': {'ESUN1': 1983, 'ESUN2': 1796, 'ESUN3': 1536}} 

eval()會工作。

演示:

TM5 = {'ESUN1':1983,'ESUN2':1796,'ESUN3':1536} 
ETM7 = {'ESUN1':1997,'ESUN2':1812,'ESUN3':1533} 

sat = 'ETM7' 
key = 'LMIN1' 
val = -1.520 
try: 
    tmp = eval(sat) 
    tmp[key] = val 
    print "Values:", tmp 
except NameError: 
    print "No dictionary variable present with name %s"%(sat) 


print "-"*10 
sat = 'STI7' 
key = 'STIN1' 
val = -1.520 
try: 
    tmp = eval(sat) 
    tmp[key] = [val] 
    print "Values:", tmp 
except NameError: 
    print "No dictionary variable present with name %s"%(sat) 

輸出:

$ python task4.py 
Values: {'ESUN2': 1812, 'ESUN3': 1533, 'ESUN1': 1997, 'LMIN1': -1.52} 
---------- 
No dictionary variable present with name STI7 
0

最簡單的方法是使用一個單一的數據結構,並使用satkey爲元組到鍵結構。不需要任何花哨。

data = {} 

def set_sat_val(sat, key, val): 
    data[(sat, key)] = val 


def get_sat_val(sat, key): 
    return data[(sat, key)] 

set_sat_val('ETM7', 'LMIN1', -1.520) 

get_sat_val('ETM7', 'LMIN1') 
>>> -1.52 

set_sat_val('ETM7', 'LMIN2', -1.620) 
set_sat_val('ETM7', 'LMIN3', -1.720) 

get_sat_val('ETM7', 'LMIN2') 
>>> -1.62 

get_sat_val('ETM7', 'LMIN3') 
>>> -1.72 
0

如果你的字典是全局變量,你可以這樣做:

globals()[sat]

全局是返回包含全局變量的字典功能。