【发布时间】:2019-01-30 15:56:40
【问题描述】:
我正在解析一个看起来像这样的字典:
data = {0: {},
1: {'1': 'M_AVL_002'},
2: {'2': 'CloudServiceAvailability'},
3: {'3': 'P_001'},
4: {'4': '2.592 x10^6'},
5: {'4': 'second'},
6: {'3': 'E_001'},
7: {'4': ' 100 x (P_001- M_TQD_001)/P_001'},
8: {'4': 'ISO80000'},
9: {'4': 'percentage'},
10: {'1': 'M_TQD_001'},
11: {'2': 'TotalQualifiedDowntime'},
12: {'3': 'E_001'},
13: {'4': '?(M_QDT_001)'},
14: {'4': 'ISO80000'},
15: {'4': 'second'}}
我想访问一些像这样的值:
for metric in XML.findall("{http://standards.iso.org/iso-iec/19086/-2/ed-1/en}Metric"):
for row,value in data.items() :
if (row==0):
pass
else :
for col,v in value.items():
if (col=="1"):
metric.set('id',str(data[row][col]))
if (col=="2"):
metric.set('description',str(data[row][col]))
if (col=="3"):
if (str(data[row][col]).startswith("E")):
metric.find('{http://standards.iso.org/iso-iec/19086/-2/ed-1/en}Expression').set("id",str(data[row][col]))
metric.find('{http://standards.iso.org/iso-iec/19086/-2/ed-1/en}Expression').set("expressionStatement",str(data[str(int(row)+1)][str(int(col)+1)]))
metric.find('{http://standards.iso.org/iso-iec/19086/-2/ed-1/en}Expression').set("expressionLanguage",str(data[str(int(row)+2)][str(int(col)+1)]))
metric.find('{http://standards.iso.org/iso-iec/19086/-2/ed-1/en}Expression').set("unit",str(data[str(int(row)+3)][str(int(col)+1)]))
elif (str(data[row][col]).startswith("P")):
for param in metric.findall('{http://standards.iso.org/iso-iec/19086/-2/ed-1/en}Parameter'):
if(str(data[row][col])==param.get('id')):
a=str(data[row][col])
print(str(int(row)+1),str(int(col)+1))
b=str(data[str(int(row)+1)][str(int(col)+1)])
c=str(data[str(int(row)+2)][str(int(col)+1)])
param.set("id",a)
param.set("parameterStatement",b)
param.set("unit",c)
else:
pass
elif (str(data[row][col]).startswith("R")):
for rule in metric.findall('{http://standards.iso.org/iso-iec/19086/-2/ed-1/en}Rule'):
if(str(data[row][col])==rule.get('id')):
a=str(data[row][col])
b=str(data[str(int(row)+1)][str(int(col)+1)])
rule.set("id",a)
rule.set("ruleStatement",b)
else :
pass
但是,我在分配了b 的行上有一个KeyError。我尝试打印 row 和 col 并检查 row+1 和 col+1 是否是键,它们是。
在程序崩溃 row=6 和 col=3 的情况下,因此在这个位置有一个值,但对于 row=7 和 col=4 也是如此,我有:KeyError :'7'
【问题讨论】:
-
分配
b时,您使用的是[str(col+1)]。我认为这可能应该是[str(int(col) + 1)],因为您的第二个键是一个字符串,并且必须对数字执行加法。 -
@Rachel 我也试过了也没用
-
你的问题是Python中字符串和数字是不同的类型,数字
2不等于字符串'2'。 -
你能说出你对
a和b的预期输出吗? -
@JackMoody
a='E_001'和 b 应该等于' 100 x (P_001- M_TQD_001)/P_001'
标签: python python-3.x dictionary keyerror