使用python与JSON交互的更快方法

2024-06-26 14:49:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚开始练习使用JSON文件并与API交互,在本例中,我正在与游戏的API(RiotAPI)交互。我有一个JSON和我的比赛历史记录,它看起来像这样(我刚刚复制了3场比赛,真实的文件更长):

{
    "matches": [
        {
            "platformId": "EUW1",
            "gameId": 4733037811,
            "champion": 111,
            "queue": 420,
            "season": 13,
            "timestamp": 1596031907965,
            "role": "DUO_SUPPORT",
            "lane": "BOTTOM"
        },
        {
            "platformId": "EUW1",
            "gameId": 4732867446,
            "champion": 25,
            "queue": 420,
            "season": 13,
            "timestamp": 1596022617021,
            "role": "DUO_SUPPORT",
            "lane": "BOTTOM"
        },
        {
            "platformId": "EUW1",
            "gameId": 4732833555,
            "champion": 111,
            "queue": 420,
            "season": 13,
            "timestamp": 1596020420595,
            "role": "DUO_SUPPORT",
            "lane": "BOTTOM"
        },
        {
            "platformId": "EUW1",
            "gameId": 4731796980,
            "champion": 53,
            "queue": 420,
            "season": 13,
            "timestamp": 1595967793994,
            "role": "DUO_SUPPORT",
            "lane": "BOTTOM"
        },

然而,我想要更多关于我的游戏的信息,所以我需要用游戏搜索特定的游戏。包含特定游戏信息的JSON如下所示(由于JSON的大小,我删除了每个玩家的一些不必要的统计信息):

{
    "gameId": 4733037811,
    "platformId": "EUW1",
    "gameCreation": 1596031907965,
    "gameDuration": 1624,
    "queueId": 420,
    "mapId": 11,
    "seasonId": 13,
    "gameVersion": "10.15.330.344",
    "gameMode": "CLASSIC",
    "gameType": "MATCHED_GAME",
    "participants": [
        {
            "participantId": 1,
            "teamId": 100,
            "championId": 61,
            "stats": {
                "participantId": 1,
                "win": true,
                "kills": 14,
                "deaths": 0,
                "assists": 7,
                "totalDamageDealt": 167616,
                "magicDamageDealt": 149177,
                "physicalDamageDealt": 10740,
                "trueDamageDealt": 7698,
                "totalDamageDealtToChampions": 22933,
                "magicDamageDealtToChampions": 21067,
                "physicalDamageDealtToChampions": 1208,
        },
        {
            "participantId": 2,
            "teamId": 100,
            "championId": 21,
            "stats": {
                "participantId": 2,
                "win": true,
                "kills": 2,
                "deaths": 3,
                "assists": 6,
                "totalHeal": 1742,
                "totalUnitsHealed": 2,
                "damageSelfMitigated": 7396,
                "damageDealtToObjectives": 19128,
                "damageDealtToTurrets": 4817,
        },
        {
            "participantId": 3,
            "teamId": 100,
            "championId": 432,
            "stats": {
                "participantId": 3,
                "win": true,
                "kills": 1,
                "deaths": 4,
                "assists": 14,
                "largestKillingSpree": 0,
                "trueDamageDealt": 3202,
                "largestCriticalStrike": 0,
                "totalDamageDealtToChampions": 7395,
                "magicDamageDealtToChampions": 5286,
        {
            "participantId": 4,
            "teamId": 100,
            "championId": 122,
            "stats": {
                "participantId": 4,
                "win": true,
                "kills": 7,
                "deaths": 2,
                "assists": 6,
                "largestKillingSpree": 5,
                "largestMultiKill": 2,
                "killingSprees": 1,
        {
            "participantId": 5,
            "teamId": 100,
            "championId": 79,
            "stats": {
                "participantId": 5,
                "win": true,
                "kills": 1,
                "deaths": 3,
                "assists": 9,
                "largestKillingSpree": 0,
                "largestMultiKill": 1,
                "killingSprees": 0,
                "longestTimeSpentLiving": 422,
                "totalDamageDealt": 143803,
                "magicDamageDealt": 104935,
                "physicalDamageDealt": 31981,
                "trueDamageDealt": 6886,
        },
        {
            "participantId": 6,
            "teamId": 200,
            "championId": 111,
            "stats": {
                "participantId": 6,
                "win": false,
               "kills": 1,
                "deaths": 5,
                "assists": 7,
                "largestKillingSpree": 0,
                "largestMultiKill": 1,
                "longestTimeSpentLiving": 460,
                "totalDamageDealt": 26611,
                "magicDamageDealt": 9267,
                "physicalDamageDealt": 11730,
                "trueDamageDealt": 5613,
                "largestCriticalStrike": 0,
        },
        {
            "participantId": 7,
            "teamId": 200,
            "championId": 56,
            "stats": {
                "participantId": 7,
                "win": false,
                "kills": 3,
                "deaths": 2,
                "assists": 3,
                "totalDamageDealt": 140699,
                "magicDamageDealt": 5378,
                "physicalDamageDealt": 131565,
                "trueDamageDealt": 3755,
                "largestCriticalStrike": 0,
                "totalDamageDealtToChampions": 6557,
                "magicDamageDealtToChampions": 455,
                "physicalDamageDealtToChampions": 5549,
                "trueDamageDealtToChampions": 552,
                "totalHeal": 12548,
                "totalUnitsHealed": 1,
                "damageSelfMitigated": 13095,
                "damageDealtToObjectives": 8279,
                "damageDealtToTurrets": 791,
        },
        {
            "participantId": 8,
            "teamId": 200,
            "championId": 55,
            "stats": {
                "participantId": 8,
                "win": false,
                "kills": 3,
                "deaths": 5,
                "assists": 1,
                "largestKillingSpree": 2,
                "largestMultiKill": 2,
                "killingSprees": 1,
                "longestTimeSpentLiving": 599,
                "doubleKills": 1,
                "tripleKills": 0,
                "quadraKills": 0,
                "pentaKills": 0,
                "unrealKills": 0,
                "totalDamageDealt": 98182,
                "magicDamageDealt": 82014,
                "physicalDamageDealt": 15485,
                "trueDamageDealt": 682,
                "largestCriticalStrike": 0,
                "totalDamageDealtToChampions": 8542,
                "magicDamageDealtToChampions": 6674,
                "physicalDamageDealtToChampions": 1185,
                "trueDamageDealtToChampions": 682,
        },
        {
            "participantId": 9,
            "teamId": 200,
            "championId": 429,
            "stats": {
                "participantId": 9,
                "win": false,
                "kills": 4,
                "deaths": 9,
                "assists": 3,
                "longestTimeSpentLiving": 489,
                "totalDamageDealt": 83886,
                "magicDamageDealt": 2860,
                "physicalDamageDealt": 77851,
                "trueDamageDealt": 3175,
                "largestCriticalStrike": 290,
                "totalDamageDealtToChampions": 16216,
                "magicDamageDealtToChampions": 1500,
                "physicalDamageDealtToChampions": 14715,
                "trueDamageDealtToChampions": 0,
        },
        {
            "participantId": 10,
            "teamId": 200,
            "championId": 68,
            "stats": {
                "participantId": 10,
                "win": false,
                "kills": 1,
                "deaths": 4,
                "assists": 0,
                "totalDamageDealt": 88848,
                "magicDamageDealt": 73156,
                "physicalDamageDealt": 11816,
                "trueDamageDealt": 3875,
                "largestCriticalStrike": 0,
                "totalDamageDealtToChampions": 12531,
                "magicDamageDealtToChampions": 11890,
                "physicalDamageDealtToChampions": 640,
                "trueDamageDealtToChampions": 0,
            },
        }
    ],
}

正如您可能看到的,在显示比赛详细信息的JSON文件中,它显示了每个球员的统计数据。为了获取我的信息,我在每个玩家之间循环,直到找到在该游戏中扮演我的冠军的玩家,该玩家在JSON文件中显示了我过去的游戏

因此,我所做的整个过程是:循环通过每一场比赛,保留“gameId”和“champion”的值,然后我用gameId搜索JSON文件,并循环通过这个JSON的所有玩家,直到找到一个有我的“champion”的玩家,以获取关于有多少人死亡的信息。。。我在那场比赛中输了。这是我的代码:

URL = "https://" + server + ".api.riotgames.com/lol/match/v4/matchlists/by-account/" + account_id + "?api_key=" + ApiKey
response = requests.get(URL)
old_games_json = response.json()
old_games_json = old_games_json['matches']

for index in range(len(old_games_json)):
    champion = (old_games_json[index]['champion'])
    
    gameid = (old_games_json[index]['gameId'])
    
    URL = "https://" + server + ".api.riotgames.com/lol/match/v4/matches/" + str(gameid) + "?api_key=" + ApiKey
    
    response = requests.get(URL)
    game_json = response.json()
    
    for player in range(len(game_json['participants'])):
        if (game_json['participants'][player]['championId']) == champion:
            win = game_json['participants'][player]['stats']["win"]
            kills = game_json['participants'][player]['stats']["kills"]
            deaths = game_json['participants'][player]['stats']["deaths"]
            assists = game_json['participants'][player]['stats']["assists"]

问题是我在一个循环中循环,运行脚本需要很长时间。我的问题是,有没有办法让这个过程更快

感谢您抽出时间阅读这篇文章


Tags: jsonstatswinkillsparticipantschampiongameiddeaths
1条回答
网友
1楼 · 发布于 2024-06-26 14:49:44

您可以使用用于理解的工具来构建字典champion_stats,如下所示(线性时间)。主循环在此之后将是线性时间(如底部所示)。注:数据已简化

old_games_json = {
    "matches": [
        {
            "platformId": "EUW1",
            "gameId": 4733037811,
            "champion": 111,
        },
        {
            "platformId": "EUW1",
            "gameId": 4732867446,
            "champion": 25
        },
        {
            "platformId": "EUW1",
            "gameId": 4731796980,
            "champion": 53
        }
    ]
}

game_json = {
    "gameId": 4733037811,
    "platformId": "EUW1",
    "gameCreation": 1596031907965,
    "gameDuration": 1624,
    "queueId": 420,
    "mapId": 11,
    "seasonId": 13,
    "gameVersion": "10.15.330.344",
    "gameMode": "CLASSIC",
    "gameType": "MATCHED_GAME",
    "participants": [
        {
            "participantId": 1,
            "teamId": 100,
            "championId": 111,
            "stats": {"win": 11}
        },
        {
            "participantId": 2,
            "teamId": 100,
            "championId": 53,
            "stats": {"win": 131}
        },
        {
            "participantId": 3,
            "teamId": 100,
            "championId": 25,
            "stats": {"win": 211}
        }
    ]
}

champion_stats = dict((participant['championId'], participant['stats']) for participant in game_json['participants'])

for match in old_games_json['matches']:
    champion_id = match['champion']
    stats = champion_stats[champion_id]
    # do stuff here with stats
    print(stats)

输出

{'win': 11}
{'win': 211}
{'win': 131}

相关问题 更多 >