Объект 'str' не поддерживает назначение элементов в Python, веб-очистка - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь реструктурировать мой уже существующий / рабочий код. Изменения производятся внутри второго цикла for. Почему я получаю сообщение об ошибке при изменении кода:

import numpy as np
import pandas as pd
import requests
import json
from sklearn import preprocessing
from sklearn.preprocessing import OneHotEncoder

games_played = []
stats_for_games = []
for game_id in range(2017020001, 2017020010, 1):
    url = 'https://statsapi.web.nhl.com/api/v1/game/{}/boxscore'.format(game_id)
    r_2017 = requests.get(url)
    game_data_2017 = r_2017.json()

    for homeaway in ['home','away']:

        game_dict_2017 = game_data_2017.get('teams').get(homeaway).get('teamStats').get('teamSkaterStats')
        game_dict_2017['team'] = game_data_2017.get('teams').get(homeaway).get('team').get('name')
        game_dict_2017['homeaway'] = homeaway
        game_dict_2017['game_id'] = game_id
        games_played.append(game_dict_2017)

print(games_played)

К этому:

import numpy as np
import pandas as pd 
import requests
import json
from sklearn import preprocessing
from sklearn.preprocessing import OneHotEncoder

games_played = []
stats_for_games = []
    for game_id in range(2017020001, 2017020010, 1):
    url = 'https://statsapi.web.nhl.com/api/v1/game/{}/boxscore'.format(game_id)
    r_2017 = requests.get(url)
    game_data_2017 = r_2017.json()

    for homeaway in ['home','away']:

        game_dict_2017 = game_data_2017.get('teams').get(homeaway).get('team').get('name')
        game_dict_2017['homeaway'] = homeaway
        game_dict_2017['game_id'] = game_id
        games_played.append(game_dict_2017)

print(games_played)

При его запуске ошибка TypeError: объект 'str' не поддерживает назначение элемента

появляется на

 game_dict_2017['homeaway'] = homeaway

Пример JSON-данных

{
copyright: "NHL and the NHL Shield are registered trademarks of the 
National Hockey League. NHL and NHL team marks are the property of the 
NHL and its teams. © NHL 2019. All Rights Reserved.",
teams: {
     away: {
         team: { 
                id: 9,
                name: "Ottawa Senators",
                link: "/api/v1/teams/9"
 },
teamStats: {
    teamSkaterStats: {
                   goals: 0,
                   pim: 0,
                   shots: 0,

 }
 }

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Хорошо, я наконец понял, в чем проблема.

Предыдущий код был:

# In this line you created a dictionary
game_dict_2017 = game_data_2017.get('teams').get(homeaway).get('teamStats').get('teamSkaterStats')

# Here, since you have dictionary you rewrote values or created new one
game_dict_2017['team'] = game_data_2017.get('teams').get(homeaway).get('team').get('name')
game_dict_2017['homeaway'] = homeaway
game_dict_2017['game_id'] = game_id
games_played.append(game_dict_2017)

Текущий код:

# Here you are getting a string
# You previous code was 
# game_dict_2017['team'] = game_data_2017.get('teams').get(homeaway).get('team').get('name')
game_dict_2017 = game_data_2017.get('teams').get(homeaway).get('team').get('name')

# Here you are trying to work with a string as with dictionary
game_dict_2017['homeaway'] = homeaway
game_dict_2017['game_id'] = game_id
games_played.append(game_dict_2017)

Чтобы решить эту проблему и предположить, что вам больше не нужна строка game_dict_2017 = game_data_2017.get('teams').get(homeaway).get('teamStats').get('teamSkaterStats'), код будет выглядеть следующим образом:

game_dict_2017 = dict()
game_dict_2017['team'] = game_data_2017.get('teams').get(homeaway).get('team').get('name')
game_dict_2017['homeaway'] = homeaway
game_dict_2017['game_id'] = game_id

Вы также можете сделать это следующим образом:

game_dict_2017 = {
    'team': game_data_2017.get('teams').get(homeaway).get('team').get('name'),
    'homeaway': homeaway,
    'game_id': game_id
}
0 голосов
/ 10 января 2019
    game_dict_2017 = game_data_2017.get('teams').get(homeaway).get('team').get('name')

Эта строка возвращает строку, т.е. "Виннипег Джетс". Быстрое решение проблемы заключается в том, чтобы сначала инициализировать game_dict_2017, а затем установить в качестве имени команды ключ dict.

Пример:

    game_dict_2017 = dict()
    game_dict_2017['teamname'] = game_data_2017.get('teams').get(homeaway).get('team').get('name')
    game_dict_2017['homeaway'] = homeaway
    game_dict_2017['game_id'] = 2017020001
    games_played.append(game_dict_2017)
0 голосов
/ 10 января 2019
    game_dict_2017 = game_data_2017.get('teams').get(homeaway).get('team').get('name')
    game_dict_2017['homeaway'] = homeaway
    game_dict_2017['game_id'] = game_id

Это проблема.

Вы определяете game_dict_2017, я полагаю, это строка. А затем попробуйте использовать его в качестве словаря, я полагаю, вы запутались game_dict_2017 и game_data_2017.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...