Search code examples
pythonjsontypeerroropenweathermap

"list indices must be integers" error, when trying to use keys from a dictionary


I tried to use the openweathermap.org rest API inside python. When I tried to assign a key from the dictionary I created with the JSON data this error occurred.

-list indices must be integers or slices, not str

I'm new to python and I couldn't find a solution to this matter. The code snip I wrote:

import requests
from pprint import pprint

lokka = str(input("What is the location you need information of?"))
#takes the location as "lokka"

hellload = requests.get("http://api.openweathermap.org/data/2.5/weather?q="+ lokka +"&appid=xxxxxxxxxxxxxxxxx&units=metric")
#the rest api's load will be taken to the account of hellload

jputha = hellload.json()
#json data will be converted to a dictionary
#print (jputha)

#---------------------------------------------------------
#from now onward I'll be kickin the hell out the jsons
long = str(jputha["coord"]["lon"])
lat = str(jputha["coord"]["lat"])
wthr = str(jputha["weather"]["main"])
temp = str(jputha["main"]["temp"])
winspd = str(jputha["wind"]["speed"])

print(long)
print(lat)
print(wthr)
print(temp)
print(winspd)

Solution

  • According to OpenWeatherMap's documentation, the JSON response from the API looks like this:

    {"coord":
    {"lon":145.77,"lat":-16.92},
    "weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04n"}],
    "base":"cmc stations",
    "main":{"temp":293.25,"pressure":1019,"humidity":83,"temp_min":289.82,"temp_max":295.37},
    "wind":{"speed":5.1,"deg":150},
    "clouds":{"all":75},
    "rain":{"3h":3},
    "dt":1435658272,
    "sys":{"type":1,"id":8166,"message":0.0166,"country":"AU","sunrise":1435610796,"sunset":1435650870},
    "id":2172797,
    "name":"Cairns",
    "cod":200}
    

    where the weather key contains a list of dicts rather than a dict, so if you simply want the first weather data from the list, you should use [0] to obtain the value of the first index instead:

    wthr = str(jputha["weather"][0]["main"])