Ошибка «TypeError: строковые индексы должны быть целыми числами» при переборе вложенного словаря с ключом цифр c - PullRequest
0 голосов
/ 02 мая 2020

Мой словарь, как показано ниже. Этот словарь хранится в переменной «api». Я использовал только отрывок из словаря, так как весь словарь очень большой и следует аналогичному формату.

{
   "sitedata":[
      {
         "info":{
            "source":"https://thevirustracker.com/"
         }}],
         "countryitems":[{
                  "1":{
         "ourid":1,
         "title":"Afghanistan",
         "code":"AF",
         "source":"https://thevirustracker.com/afghanistan-coronavirus-information-af",
         "total_cases":2335,
         "total_recovered":310,
         "total_unresolved":0,
         "total_deaths":68,
         "total_new_cases_today":0,
         "total_new_deaths_today":0,
         "total_active_cases":1957,
         "total_serious_cases":7         },
                 "2":{
         "ourid":2,
         "title":"Albania",
         "code":"AL",
         "source":"https://thevirustracker.com/albania-coronavirus-information-al",
         "total_cases":782,
         "total_recovered":488,
         "total_unresolved":0,
         "total_deaths":31,
         "total_new_cases_today":0,
         "total_new_deaths_today":0,
         "total_active_cases":263,
         "total_serious_cases":4         },
                 "3":{
         "ourid":3,
         "title":"Algeria",
         "code":"DZ",
         "source":"https://thevirustracker.com/algeria-coronavirus-information-dz",
         "total_cases":4154,
         "total_recovered":1821,
         "total_unresolved":0,
         "total_deaths":453,
         "total_new_cases_today":0,
         "total_new_deaths_today":0,
         "total_active_cases":1880,
         "total_serious_cases":22         },
                 "4":{
         "ourid":4,
         "title":"Angola",
         "code":"AO",
         "source":"https://thevirustracker.com/angola-coronavirus-information-ao",
         "total_cases":30,
         "total_recovered":11,
         "total_unresolved":0,
         "total_deaths":2,
         "total_new_cases_today":0,
         "total_new_deaths_today":0,
         "total_active_cases":17,
         "total_serious_cases":0         },
                 "5":{
         "ourid":5,
         "title":"Argentina",
         "code":"AR",
         "source":"https://thevirustracker.com/argentina-coronavirus-information-ar",
         "total_cases":4532,
         "total_recovered":1292,
         "total_unresolved":0,
         "total_deaths":225,
         "total_new_cases_today":0,
         "total_new_deaths_today":0,
         "total_active_cases":3015,
         "total_serious_cases":157         },
             .
             .
             .
                                   "stat":"ok"
        }]}

Я пытаюсь перебрать этот словарь, чтобы выбрать названия стран, используя следующий код:


api_request = requests.get('https://api.thevirustracker.com/free-api?countryTotals=ALL')

api = json.loads(api_request.content)

dict = api['countryitems'][0]

for key in dict:

    country = api['countryitems'][0][key]['title']
    print(country)

Но я получаю сообщение об ошибке " TypeError: строковые индексы должны быть целыми числами ".

Может кто-нибудь, пожалуйста, посоветуйте, что именно здесь происходит не так. Я использую этот код на Python 3.7 (Tkinter)

1 Ответ

0 голосов
/ 02 мая 2020
  • При выполнении итераций по словарю он приходит к ключу с именем "stat", и его значение просто "ok" и его тип String. Но все остальные элементы словаря содержат другой словарь, как показано ниже:

enter image description here

  • Итак, вы попытались получить доступ к элементу называется ['title'], и он выдаст вышеуказанную ошибку.
  • Опять же, я также удалил символы юникода из словаря с помощью
    , добавив строку ниже,
import ast

api = {}
api_request = requests.get('https://api.thevirustracker.com/free-api?countryTotals=ALL')

api = json.loads(api_request.content)
api = ast.literal_eval(json.dumps(api))
  • Вот мой ответ,

Пример кода, как показано ниже,

import requests
import json
import ast

api = {}
api_request = requests.get('https://api.thevirustracker.com/free-api?countryTotals=ALL')

api = json.loads(api_request.content)
api = ast.literal_eval(json.dumps(api))

dict = api['countryitems'][0]


for key in dict:
    if (str(key).isdigit()):
        country = dict[key]['title']
        print (country)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...