Подсчет элементов dict в подмассиве дает неожиданное число

#python #dictionary #indexing

#python #словарь #индексирование

Вопрос:

Я подсчитываю элементы в подмассиве в файле json, чтобы избежать «ошибки IndexError: индекс списка вне диапазона», но количество элементов> то, что я ожидаю.

Добавление тестового кода print(diclen);print(dic) дает мне значение> то, что я исключаю (8 экземпляров propValue), вывод:

12

{‘Propcontgroup’: {‘propcontegory’: {‘propConcept’: [{‘propCategory’: ‘NAMES’, ‘propName’: ‘RxNorm Name’, ‘propValue’: ‘lercanidipine’}, {‘propCategory’: ‘CODES’, ‘propName’: ‘RxCUI’, ‘propValue’: ‘135056’}, {‘propCategory’: ‘CODES’, ‘propName’: ‘UMLSCUI’, ‘propValue’: ‘C0526399’}, {‘propCategory’: ‘CODES’, ‘propName’: ‘ATC’, ‘propValue’: ‘C08CA13’}, {‘propCategory’: ‘CODES’, ‘propName’: ‘DRUGBANK’, ‘propValue’: ‘DB00528’}, {‘propCategory’: ‘CODES’, ‘propName’: ‘MESH’, ‘propValue’: ‘C060343’}, {‘propCategory’: ‘CODES’, ‘propName’: ‘SNOMEDCT’, ‘propValue’: ‘356862006’}, {‘propCategory’: ‘CODES’, ‘propName’: ‘SNOMEDCT’, ‘propValue’: ‘395986007’}]}}

 def getdrugbank(rx):
    urlroot = 'https://rxnav.nlm.nih.gov/REST/rxcui/'
    urlend = '/allProperties.json?prop=names codes'
    url = urlroot   rx   urlend
    response = requests.get(url)
    dic = response.json()
    i=0; drugbank = "NA"
    if dic == {"propConceptGroup":None}:
        drugbank = "NA"
    else:
        diclen = len(dic['propConceptGroup']['propConcept'][0]['propValue'])-1
        print(diclen);print(dic)
        for i in range(0,diclen):
            if dic['propConceptGroup']['propConcept'][i]['propName'] == "DRUGBANK":    
                drugbank = dic['propConceptGroup']['propConcept'][i]['propValue']
    return drugbank
  

Ответ №1:

len(dic['propConceptGroup']['propConcept'][0]['propValue']) это будет равно длине значения dic['propConceptGroup']['propConcept'][0]['propValue'] , поэтому вы вычисляете длину propValue строк, таких как DB00528 .

Что вам нужно, так это знать количество элементов в массиве, которое вы получаете с помощью ust len(dic['propConceptGroup']['propConcept'])

Ответ №2:

спасибо за ваш ответ @Anler

я обнаружил, что проблема была в моей индексации, и len(dic[‘propcontgroup’][‘propConcept’][0][‘propValue’]) выдает длину строки ‘propValue’, а НЕ массив, я ожидал подмассив

основываясь на этом, я отключил функцию len() и переписал код для циклического прохождения подмассива dict, проверяя наличие ключа propName (для значения propValue) и «получая» значения, которые я ищу, используя [i][0][‘propName’]

 for i in dic['propConceptGroup']['propConcept']:
            if [i][0]['propName'] == "DRUGBANK":
                print([i][0]['propValue'])
                drugbank = [i][0]['propValue']
                break
            elif [i][0]['propName'] == "SPL_SET_ID":
                break