我正在创建一个预处理Landsat卫星图像的自动脚本。脚本解析元数据文本文件以查找校正系数。已有6个现有词典(类似于下面)包含处理图像所需的一些系数,具体取决于收集图像的卫星和传感器:
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,这个字符串变量实际上是现有字典的名称,所以添加这个key / val对而不必完全重新创建/覆盖现有字典字典。有没有办法做到这一点?提前谢谢!
答案 0 :(得分: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
答案 1 :(得分:0)
最简单的方法是使用单个数据结构,并使用sat
和key
作为元组来键入结构。不需要任何花哨的东西。
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
答案 2 :(得分:0)
如果你的词典是全局变量,你可以这样做:
globals()[sat]
globals是一个返回包含全局变量的字典的函数。
答案 3 :(得分:0)
如果您真的想使用包含其名称的字符串引用字典,请使用eval(sat)[key]
代替sat[key]
。