KeyError в dict, но Key существует - PullRequest
0 голосов
/ 30 января 2019

Я работаю над разбором диктовок, которые выглядят так:

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

Однако у меня есть KeyError в строке, где назначено b.Я попытался напечатать row и col и проверил, являются ли строки + 1 и col + 1 ключами, и они есть.

В случае, если программа аварийно завершает работу row = 6 и col = 3, поэтому в этом расположении есть значение, но это также верно для row = 7 и col = 4, и у меня есть: KeyError :'7'

Ответы [ 2 ]

0 голосов
/ 30 января 2019
for row,value in data.items() :
    for col,v in value.items():
        a=data[row][col]
        b=data[row+1][str(int(col)+1)]

Но в строке точек = 4 и col = 4 вы получите ошибку, потому что в данных нет элемента data [5] ['5'].

Обратите внимание, что данные['4'] и данные [4] - разные вещи.Вот почему вам нужно получить элемент dict по правильному ключу.

0 голосов
/ 30 января 2019

Ключи внешнего словаря являются целыми числами, поэтому не следует преобразовывать их в строки.

for row,value in data.items() :
    for col,v in value.items():
        a=data[row][col]
        b=data[row+1][str(int(col)+1)]

Однако у вас снова будет KeyError!Распечатайте ключи, к которым вы пытаетесь получить доступ.

for row,value in data.items() :
    for col,v in value.items():
        a=data[row][col]
        print(row+1, str(int(col)+1))

Вы получите:

2 2
3 3
4 4
5 5
6 5
7 4
8 5
9 5
10 5
11 2
12 3
13 4
14 5
15 5
16 5

Не все из них действительны.Таким образом, «KeyError in dict, но Key существует» не является верным утверждением!

...