Поиск позиций для «печати» в больших массивах для Python?

#python #arrays

#python #массивы

Вопрос:

Я изучаю, как получать данные из массивов, и я немного застрял на простом способе определения местоположения этих данных, чтобы извлечь их из массива. Кажется, что должен быть более простой способ, чем подсчет на экране.

Вот что у меня есть:

 r2 = requests.get(
    f'https://www.thesportsdb.com/api/v1/json/{apiKey}/lookupevent.php?id={id}')

arr_events = np.array([r2.json()])

#print(arr_events)

event_id = arr_events[0]['events'][0]['idEvent']
locate = arr_events.index('strHomeTeam')
print(locate)
  

Проблема в том, что на консоли выводится огромный массив, который выглядит как (я приведу одну строку, вы, вероятно, поняли идею):

 [{'events': [{'idEvent': '1032723', 'idSoccerXML': None, 'idAPIfootball': '592172', 'strEvent': 'Aston Villa vs Liverpool', 'strEventAlternate': 'Liverpool @ Aston Villa', 'strFilename': 'English Premier League 2020-10-04 Aston Villa vs Liverpool'...}]}]
  

Это большой массив, достаточный, чтобы вызвать незначительное замедление, если мне понадобится получить некоторую информацию.

Итак, idEvent было легко извлечь, используя описанный выше метод. И если бы я хотел, чтобы некоторые из этих других были в верхней строке, вероятно, не сложно сосчитать до 5 или 6. Но я знаю, что для Python должен быть более простой способ просто найти те, которые я хочу. Например, я хочу, чтобы команда дома и на выезде:

 'strHomeTeam': 'Aston Villa', 'strAwayTeam': 'Liverpool',
  

Итак, есть ли более простой способ просто извлечь «strHomeTeam», а не считать весь путь до точки в массиве?

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

Файл JSON находится здесь: https://www.thesportsdb.com/api/v1/json/1/lookupevent.php?id=1032723

Спасибо за вашу помощь в этом — я ценю это.

Комментарии:

1. Что за np.array([...]) вызов? Массив NumPy не дает вам никакой пользы.

2. Я не понимаю, почему подсчет вообще будет задействован. Если вы хотите получить значение 'strHomeTeam' ключа в dict, вы просто делаете ...['strHomeTeam'] , как и делали ...['idEvent'] .

3. Я думаю, что я понял это немного поздно… ха-ха … спасибо 🙂

Ответ №1:

Итак, есть ли более простой способ просто извлечь «strHomeTeam», а не считать весь путь до точки в массиве?

Попробуйте следующее

 data = {"events": [
    {"idEvent": "1032723", "idSoccerXML": "", "idAPIfootball": "592172", "strEvent": "Aston Villa vs Liverpool",
     "strEventAlternate": "Liverpool @ Aston Villa",
     "strFilename": "English Premier League 2020-10-04 Aston Villa vs Liverpool", "strSport": "Soccer",
     "idLeague": "4328", "strLeague": "English Premier League", "strSeason": "2020-2021",
     "strDescriptionEN": "Aston Villa and Liverpool square off at Villa Park, where last season, these teams produced one of the most exciting finishes of the campaign, as Liverpool scored twice late on to overturn an early Trezeguet goal.",
     "strHomeTeam": "Aston Villa", "strAwayTeam": "Liverpool", "intHomeScore": "7", "intRound": "4",
     "intAwayScore": "2", "intSpectators": "", "strOfficial": "", "strHomeGoalDetails": "", "strHomeRedCards": "",
     "strHomeYellowCards": "", "strHomeLineupGoalkeeper": "", "strHomeLineupDefense": "",
     "strHomeLineupMidfield": "", "strHomeLineupForward": "", "strHomeLineupSubstitutes": "",
     "strHomeFormation": "", "strAwayRedCards": "", "strAwayYellowCards": "", "strAwayGoalDetails": "",
     "strAwayLineupGoalkeeper": "", "strAwayLineupDefense": "", "strAwayLineupMidfield": "",
     "strAwayLineupForward": "", "strAwayLineupSubstitutes": "", "strAwayFormation": "", "intHomeShots": "",
     "intAwayShots": "", "strTimestamp": "2020-10-04T18:15:00 00:00", "dateEvent": "2020-10-04",
     "dateEventLocal": "2020-10-04", "strDate": "", "strTime": "18:15:00", "strTimeLocal": "19:15:00",
     "strTVStation": "", "idHomeTeam": "133601", "idAwayTeam": "133602", "strResult": "", "strVenue": "Villa Park",
     "strCountry": "England", "strCity": "", "strPoster": "", "strFanart": "",
     "strThumb": "https://www.thesportsdb.com/images/media/event/thumb/r00vzl1601721606.jpg", "strBanner": "",
     "strMap": "", "strTweet1": "https://twitter.com/brfootball/status/1312843172385521665",
     "strTweet2": "https://twitter.com/TomJordan21/status/1312854281444306946",
     "strTweet3": "https://twitter.com/FutbolBible/status/1312847622592442370",
     "strVideo": "https://www.youtube.com/watch?v=0Nbw3jSafGM", "strStatus": "Match Finished", "strPostponed": "no",
     "strLocked": "unlocked"}]}
filtered_data = [{'home':entry['strHomeTeam'],'away':entry['strAwayTeam']}for entry in data['events']]
print(filtered_data)
  

вывод

 [{'home': 'Aston Villa', 'away': 'Liverpool'}]
  

Комментарии:

1. Спасибо вам за это! Я обязательно буду использовать этот метод. Это действительно сложно, когда есть что-то довольно простое, но ответ найти не так просто, как хотелось бы 🙂 Еще раз спасибо!

Ответ №2:

Ug… Я попробовал что-то другое, и это сработало — вздох… Прошу прощения.

 event_id = arr_events[0]['events'][0]['idEvent']
home_team = arr_events[0]['events'][0]['strHomeTeam']
away_team = arr_events[0]['events'][0]['strAwayTeam']
home_score = arr_events[0]['events'][0]['intHomeScore']
away_score = arr_events[0]['events'][0]['intAwayScore']
  

Я предполагаю, что это правильный способ сделать это.

Комментарии:

1. смотрите мой ответ. Это общий.

Ответ №3:

Вы должны изучить https://python-json-pointer.readthedocs.io/en/latest/tutorial.html

проверьте json, получите путь, по которому вы хотите получить доступ к значению -> использовать https://github.com/stefankoegl/python-json-pointer