Search code examples
pythonnonetype

'NoneType' object is not subscriptable while trying to create a array with json data


Here is my code:

import math
import json

def make_teams_games():

cows=[0 for x in range (3)]
counter = 0
with open('2016ultimatedata.json') as jsonfile:
    d2016 = json.load(jsonfile)                                                     

    for i in d2016['teams']:
        if i['name'] == 'Oberlin (Flying Horsecows)':
            cows[0] = i['name']
            cows[1] = i['id']
            cows[2] = i['usau_rating']['score']
    for i in d2016['teams']:
        if i['usau_rating']['score'] != None:
            if i['usau_rating']['score'] > (cows[2]-120) and i['usau_rating']['score'] < (cows[2]+120):
                counter = counter+1
            print(counter)
    teams = [[0 for x in range (3)] for y in range (counter)]

make_teams_games()

Im aware that the third if statement can probably be written using a absolute value, but the error message is being thrown the line above. Why am I getting this error?

Here is a sample of part of the json file:

    "teams": [
{
  "id": "dHP4OF2933HXVGrIpWK%2f4FCcI6ithl6x98Nwnx3%2b6Ic",
  "usau_rating": {
    "wins": 10,
    "score": 1330.0,
    "losses": 8
  },
  "name": "Alabama-Birmingham (Inferno)"
},
{
  "id": "Bh3IMJNlD144zClqw0PgIIksuF%2fKC5MCDoo%2fbjsZ0f0",
  "usau_rating": null,
  "name": "Wisconsin-Stout (Yeti Ultimate)"
},
{
  "id": "QwWYWgLFpfsquPuzXaPZ1jc1hlf3kw%2bUWQEqdH5FGbc",
  "usau_rating": {
    "wins": 14,
    "score": 1107.0,
    "losses": 4
  },
  "name": "RIT (RIT Spudheds)"
},
{
  "id": "%2bIG3fKP7FAnAoAmq5paF760u9emIIlzIWoGNKGzb1zs",
  "usau_rating": {
    "wins": 9,
    "score": 846.0,
    "losses": 11
  },
  "name": "Princeton (Clockwork)"
},
{
  "id": "rHK4D3huWbOjSr20VH%2f37Tq%2bcDh52EYpYqXPEHyBloQ",
  "usau_rating": {
    "wins": 11,
    "score": 1188.0,
    "losses": 7
  },
  "name": "Dayton (UD Ultimate)"
}

And here is the traceback:

    Traceback (most recent call last):
    File "game_diff_by_difference_in_team_diff.py", line 24, in <module>
    make_teams_games()
    File "game_diff_by_difference_in_team_diff.py", line 18, in    make_teams_games
    if i['usau_rating']['score'] != None:
    TypeError: 'NoneType' object is not subscriptable

Solution

  • Looks like i['usau_rating'] is None. Try

    if i['usau_rating'] is not None and i['usau_rating']['score'] is not None:
        ....
    

    This way you check if the first dictionary lookup is None before trying to subscript it.


    sidenote: I used the is not semantic instead of != because is checks for type not just 'falsy' values like != does. You can check out this answer if you care to learn more