【问题标题】:Sorting JSON response with Python使用 Python 对 JSON 响应进行排序
【发布时间】:2016-03-06 03:23:15
【问题描述】:

例如,需要帮助弄清楚如何按从大到小对 JSON 响应进行排序。以下是 JSON 响应的一部分:

{
"queue": "RANKED_SOLO_5x5",
"name": "Riven's Cutthroats",
"entries": [
  {
     "leaguePoints": 812,
     "isFreshBlood": false,
     "isHotStreak": false,
     "division": "I",
     "isInactive": false,
     "isVeteran": false,
     "losses": 277,
     "playerOrTeamName": "CLG Bunso",
     "playerOrTeamId": "19732914",
     "wins": 356
  },
  {
     "leaguePoints": 567,
     "isFreshBlood": false,
     "isHotStreak": false,
     "division": "I",
     "isInactive": false,
     "isVeteran": false,
     "losses": 56,
     "playerOrTeamName": "SKT Frost",
     "playerOrTeamId": "66401633",
     "wins": 160
  },
  {
     "leaguePoints": 751,
     "isFreshBlood": false,
     "isHotStreak": false,
     "division": "I",
     "isInactive": false,
     "isVeteran": true,
     "losses": 421,
     "playerOrTeamName": "C9 Hard",
     "playerOrTeamId": "47836799",
     "wins": 494
  },
  {
     "leaguePoints": 587,
     "isFreshBlood": false,
     "isHotStreak": true,
     "division": "I",
     "isInactive": false,
     "isVeteran": false,
     "losses": 157,
     "playerOrTeamName": "ShadowFiendv",
     "playerOrTeamId": "71181475",
     "wins": 265
  },
  {
     "leaguePoints": 1109,
     "isFreshBlood": false,
     "isHotStreak": false,
     "division": "I",
     "isInactive": false,
     "isVeteran": true,
     "losses": 353,
     "playerOrTeamName": "ApoIlo Price",
     "playerOrTeamId": "7250",
     "wins": 425
  },

现在,我已经获取了我需要的必要信息,如下所示:

def getChallengerLadder(region, APIKey):
    URL = "https://" + region + ".api.pvp.net/api/lol/" + region +     "/v2.5/league/challenger?type=RANKED_SOLO_5x5&api_key=" + APIKey
    print (URL)
    response = requests.get(URL)
    return response.json()


   responseJSON3 = getChallengerLadder(region, APIKey)
    x = 0
    while True:
        print (responseJSON3['entries'][x]['leaguePoints'], responseJSON3['entries'][x]['playerOrTeamName'] )
         x += 1

结果我得到一个列表如下(同样,下面只是一个小样本):

608 Z Y Xydra
552 Silas Kroeger
1109 ApoIlo Price
601 Blem
587 Boy vs Girl
701 l am Bjerg
560 duo to homecomin

我想按从大到小对这个列表进行排序,但我不知道该怎么做。任何帮助将不胜感激!有没有比我已经完成的更好的方法?我假设您必须将响应放入数组中并对数组进行排序?还是有更好的方法?

【问题讨论】:

    标签: python json sorting


    【解决方案1】:

    leaguePoints排序

    (我只使用json 模块来创建完整的工作示例)

    text = '''{
    "queue": "RANKED_SOLO_5x5",
    "name": "Riven's Cutthroats",
    "entries": [
      {
         "leaguePoints": 812,
         "isFreshBlood": false,
         "isHotStreak": false,
         "division": "I",
         "isInactive": false,
         "isVeteran": false,
         "losses": 277,
         "playerOrTeamName": "CLG Bunso",
         "playerOrTeamId": "19732914",
         "wins": 356
      },
      {
         "leaguePoints": 567,
         "isFreshBlood": false,
         "isHotStreak": false,
         "division": "I",
         "isInactive": false,
         "isVeteran": false,
         "losses": 56,
         "playerOrTeamName": "SKT Frost",
         "playerOrTeamId": "66401633",
         "wins": 160
      },
      {
         "leaguePoints": 751,
         "isFreshBlood": false,
         "isHotStreak": false,
         "division": "I",
         "isInactive": false,
         "isVeteran": true,
         "losses": 421,
         "playerOrTeamName": "C9 Hard",
         "playerOrTeamId": "47836799",
         "wins": 494
      },
      {
         "leaguePoints": 587,
         "isFreshBlood": false,
         "isHotStreak": true,
         "division": "I",
         "isInactive": false,
         "isVeteran": false,
         "losses": 157,
         "playerOrTeamName": "ShadowFiendv",
         "playerOrTeamId": "71181475",
         "wins": 265
      },
      {
         "leaguePoints": 1109,
         "isFreshBlood": false,
         "isHotStreak": false,
         "division": "I",
         "isInactive": false,
         "isVeteran": true,
         "losses": 353,
         "playerOrTeamName": "ApoIlo Price",
         "playerOrTeamId": "7250",
         "wins": 425
      }
    ]
    }'''
    
    import json
    
    # simulate `getChallengerLadder`
    responseJSON3 = json.loads(text)
    
    result = sorted(responseJSON3['entries'], key=lambda x:x['leaguePoints'])
    
    print result
    

    【讨论】:

    • 您好,谢谢您的回答。在您的示例中,您将“文本”设置为 JSON 响应的变量。如果我手头没有文字,我该怎么做?基本上,只有当我从 API 提示 JSON 时,文本才可用,并且每隔几分钟就会更改一次。例如,我不能做这样的事情:text = '''print (responseJSON3)'''' 因为那么 responseJSON3 被视为引号内的字符串? S对不起,如果这看起来很简单,我只是在学习 Python
    • 我只使用json.loads(text) 来模拟API 并获得类似于responseJSON3 的结果来创建工作示例。我在答案中将变量 j 更改为 responseJSON3
    • print 在屏幕上发送文本,您不能将其分配给变量。您可以text = str(some_object),但要获得正确的 JSON 文本,最好使用text = json.dumps(responseJSON3)。 (但在我的示例中,您不必将 resonseJSON3 转换为文本)
    • 谢谢,其实我上周就知道了,忘了再看你的回复,我使用了你的 sorted() 方法,将它分配给变量,然后打印了我需要的 2 个条目(leaguePoints 和 playerOrTeamName)
    猜你喜欢
    • 1970-01-01
    • 2017-09-01
    • 2018-07-05
    • 2014-11-15
    • 1970-01-01
    • 2017-12-28
    • 2019-05-17
    • 2021-01-19
    • 1970-01-01
    相关资源
    最近更新 更多