#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