Python将字符串转换为现有的dict名称以添加键值对

时间:2015-03-02 16:23:51

标签: python dictionary

我正在创建一个预处理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对而不必完全重新创建/覆盖现有字典字典。有没有办法做到这一点?提前谢谢!

4 个答案:

答案 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)

最简单的方法是使用单个数据结构,并使用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

答案 2 :(得分:0)

如果你的词典是全局变量,你可以这样做:

globals()[sat]

globals是一个返回包含全局变量的字典的函数。

答案 3 :(得分:0)

如果您真的想使用包含其名称的字符串引用字典,请使用eval(sat)[key]代替sat[key]