Ошибка Python: ошибка типа: индексы списка должны быть целыми числами или срезами, а не str

#python

#python

Вопрос:

я получаю эту ошибку в этой строке : valor_mensal_aux[i] = int(data['Dados'][0][json_date][0]['valor'])

я попытался опубликовать здесь некоторый код, чтобы вы, ребята, могли получить контекст для всех переменных:

 if len(imobs) == 0:

   year_codes = ["2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020"]

   month_codes = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]

   city_codes = ["1111609", "1120303", "11A1312", "11D1714", "11E0402", "16D0105", "16E0603", "16F1009", "16G1823",
                 "16H0502", "16J0907", "1701106", "1701512", "1840205", "1851416", "1861214", "1870705", "1500805"]

   valor_mensal_aux = [0]
   valor_anual = [0][0]
   # valor_anual_ano_inicial = [18] # array com valor anual de cada cidade para ano inicial
   # valor_anual_ano_final = [18] # array com valor anual de cada cidade para ano final

   for city_code in city_codes:

       for year_code in year_codes:

           for month_code in month_codes:

               url_imob = Request(
                   "https://www.ine.pt/ine/json_indicador/pindica.jsp?op=2amp;varcd=0010042amp;Dim1=S3A"   year_code   
                   month_code   "amp;Dim2="   city_code   "amp;Dim3=Tamp;lang=PT", headers={'User-Agent': 'XYZ/3.0'})
               json_date = year_code   month_code
               response = urlopen(url_imob)
               data = json.loads(response.read())
               i = 0
               while i < 12:
                   valor_mensal_aux[i] = int(data['Dados'][0][json_date][0]['valor'])
                   i  = 1

           valor_anual[data['geodsg']][year_code] = statistics.mean(valor_mensal_aux)

           python_imob = Imob(year_code, valor_anual[city_code][year_code], data['DataUltimoAtualizacao'],
                              data['Dados'][json_date]['geodsg'])
           session.add(python_imob)  
           session.commit()
           session.close()
           imobs = session.query(Imob).all() 
  

Что я могу изменить, чтобы решить эту проблему? И я надеюсь, что после этой строки кода больше не будет ошибок 🙂

Комментарии:

1. как выглядят данные data ? data может содержать список dicts

2. Итак, какой ключ неверен? json_date , 'Dados' или 'valor' ?

3. Ваш ['Dados'] , ваш json_date или ваш ['valor'] неверен, зависит от того, как извлекается data значение. Я думаю, вам нужно сделать valor_mensal_aux[i] = int(data['Dados'][0][int(json_date)][0]['valor']) преобразование json_date в целое число.

Ответ №1:

Я попытался получить доступ к соответствующей веб-странице, и типичный объект, загруженный из ответа JSON, выглядит следующим образом:

 [{'Dados': {'201101': [{'dim_3': 'T',
                        'dim_3_t': 'Total',
                        'geocod': '1111609',
                        'geodsg': 'Viana do Castelo',
                        'valor': '779'}]},
  'DataExtracao': '2020-09-03T14:21:27.691 01:00',
  'DataUltimoAtualizacao': '2020-08-27',
  'IndicadorCod': '0010042',
  'IndicadorDsg': 'Valor mediano de avaliação bancária (€/ m²) por Localização '
                  'geográfica (Município - 2013) e Tipo de construção; Mensal '
                  '- INE, Inquérito à avaliação bancária na habitação',
  'MetaInfUrl': 'https://www.ine.pt/bddXplorer/htdocs/minfo.jsp?var_cd=0010042amp;lingua=PT',
  'UltimoPref': 'Julho de 2020'}]
  

Это означает, что вам нужно получить к нему доступ следующим образом:

 data[0]['Dados'][json_date][0]['valor']
  

Вместо этого у вас было:

 data['Dados'][0][json_date][0]['valor']
  

У вас также возникнут проблемы при попытке назначить конец списка. Вы, вероятно, хотите что-то вроде этого:

        for year_code in year_codes:
           valor_mensal_aux = []
           for month_code in month_codes:
                ......
                valor_mensal_aux.append(int(data[0]['Dados'][json_date][0]['valor']))
  

и не зацикливайтесь i внутри вашего месячного цикла — добавляйте его только один раз за каждый месяц.

Комментарии:

1. Спасибо, это решило ошибку! Но теперь я получаю эту ошибку из той же строки кода: «Ошибка индекса: индекс назначения списка вне диапазона»

2. Ах, хорошо, вместо этого вам нужно сделать valor_mensal_aux.append(.....)

3. @TiagoMendes Я добавил к ответу некоторую информацию о добавлении в ваш valor_mensal_aux список. Но у вас также будут похожие проблемы, касающиеся valor_anual и, боюсь, вам нужно будет решить их отдельно или задать другой вопрос, потому что исправление каждой ошибки выходит за рамки этого ответа.

4. вместо «=»? а как насчет [i]?