Итерация по JSON с массивами разных размеров - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь перебрать большой JSON объект, который имеет несколько вложенных объектов. Мне нужно извлечь названия команд, время начала и оценки каждой группы в JSON. Я успешно сделал это для JSON данных, которые организованы в форме совпадения по совпадению, но я не могу сделать правильный цикл для извлечения данных, когда они разделены на группы. Что делает это трудным, так это то, что в каждой группе разное количество команд, и поэтому в каждой группе разное количество матчей.

Сам JSON: https://dtmwra1jsgyb0.cloudfront.net/stages/5e223506edae743046ecdaa1/groups/round/1

Сайт, который использует JSON: https://battlefy.com/college-league-of-legends/2020-eastern-college-athletic-conference/5e1d0496beecfa23958b37ca/stage/5e223506edae743046ecdaa1/bracket/?groupName=A

Мне нужны значения team, score и startTime. Идентификатор группы не важен.

Мой код пока:

from pytz import timezone
import requests,json,sys
from teams import teams

team1, team2, score1, score2, winner, date = ([] for y in range(6))
hour, minute, month, day, year = ([] for y in range(5))
timex = []

def jloader():

    link = "https://dtmwra1jsgyb0.cloudfront.net/stages/5e2fa0dda134095e8e1221f2/groups/round/1"
    response = json.loads(requests.get(link).text)
    x = len(response)

    if "group" in link:
        count = 0
        inner = []
        for i in range(x):
            inner.append(len(response[i]['matches']))
            count = count+1 
        matchFill(x, response, inner, count)

    winnerFill(x)
    rename(x)
    printer(x)

def matchFill(con, response, inner, count):

    #issues looping in this area
    def nameFill(x, inner):
        for i in range(x):
            for j in range(inner[j]):
                try:
                    team1.append(response[i]['top'][j]['name'])
                except KeyError:
                    team1.append('')    
                    continue

        #issues looping in this area
        for i in range(x, inner):
            for j in inner[j]:
                try:
                    team2.append(response[i]['bottom'][j]['name'])
                except KeyError:
                    team2.append('')    
                    continue

    #issues looping in this area
    def scoreFill(x):
        for m in range(x):  
            for n in inner[n]:
                try:
                    score1.append(response[m]['top'][n]['score'])
                except KeyError:
                    score1.append('')   
                    continue

        #issues looping in this area
        for m in range(x):  
            for n in inner[n]:
                try:
                    score2.append(response[m]['bottom'][n]['score'])
                except KeyError:
                    score2.append('')   
                    continue

    #issues looping in this area
    def getTime(x):
        for b in range(x):
            try:
                timex.append(datetime.strptime(response[b]['schedule']['startTime'], '%Y-%m-%dT%H:%M:%S.%fZ'))
                timex[b] = (timex[b] - timedelta(hours=3))
            except KeyError:
                timex.append(datetime.strptime(response[b]['createdAt'], '%Y-%m-%dT%H:%M:%S.%fZ'))
                timex[b] = (timex[b] - timedelta(hours=3))

        for a in range(x):
            date.append(timex[a].strftime("%Y-%m-%d"))
            hour.append(timex[a].strftime("%H"))
            minute.append(timex[a].strftime("%M"))


    nameFill(con, inner)
    scoreFill(con, inner)
    getTime(con)
    return  


def winnerFill(x):      
    for j in range(x):
            if (score1[j] > score2[j]):
                    winner.append('1')
            elif (score2[j] > score1[j]):
                    winner.append('2')
            else:
                    winner.append('')

def rename(x):      
    for g in range(x):
        team1[g] = teams.get(str(team1[g]), team1[g])
        team2[g] = teams.get(str(team2[g]), team2[g])   

def printer(x):
    for y in range(x):
        print("{{MatchSchedule" + "|team1=" + str(team1[y]) + "|team2=" + str(team2[y]) + "|team1score=" + str(score1[y]) + "|team2score=" + str(score2[y]) + "|winner=" + str(winner[y]) + "|date=" + str(date[y]) + "|time=" + str(hour[y]) + ":" + str(minute[y]) + "|timezone=PST|dst=no|vod1=|stream=}} \n")

if __name__ == "__main__":
    jloader()```
...