按日期对对象列表进行排序

2024-04-29 01:21:00 发布

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

我有一张这样的单子

"Tournaments": [
      {
        "Scrambling": "61.90",
        "Total_Putts_GIR": 85,
        "SG_Putting": 0.99,
        "Tournament": "Sony_Open",
        "Date": "01-09-2020"
      },
      {
        "Scrambling": "68.75",
        "Total_Putts_GIR": 93,
        "SG_Putting": 1.1,
        "Tournament": "Waste_Management",
        "Date": "01-30-2020"
      },
      {
        "Scrambling": "64.71",
        "Total_Putts_GIR": 70,
        "SG_Putting": -0.26,
        "Tournament": "WGC_Mexico",
        "Date": "02-20-2020"
      },
      {
        "Scrambling": "57.14",
        "Total_Putts_GIR": 40,
        "SG_Putting": -1.45,
        "Tournament": "Charles_Schwab",
        "Date": "06-11-2020"
      },
      {
        "Scrambling": "73.68",
        "Total_Putts_GIR": 82,
        "SG_Putting": 1.65,
        "Tournament": "RBC_Heritage",
        "Date": "06-18-2020"
      },
      {
        "Scrambling": "66.67",
        "Total_Putts_GIR": 92,
        "SG_Putting": 0.34,
        "Tournament": "Rocket_Mortgage",
        "Date": "07-02-2020"
      },
      {
        "Scrambling": "83.33",
        "Total_Putts_GIR": 101,
        "SG_Putting": 1.19,
        "Tournament": "Shriners_Hospital_for_Children_Open",
        "Date": "10-08-2019"
      }
    ]

我曾经

for obj in player_stats:
    for tournament in obj['Tournaments']:
        obj['Tournaments'].sort(key=operator.itemgetter('Date'))

然而,为了对它们进行分类,它将2019年列为底部。当我添加reverse=True时,它也会反转月份。我尝试使用obj['Tournaments'].sort(key=lambda x: tournament['Date']),但这只是以相同的顺序返回dict。我需要返回目录列表,按2019年、2020年排序,然后按月份排序,然后按天排序


Tags: inobjfordate排序opensgtotal
3条回答

解决方案

另一个选项是使用pandas库对词典进行排序。现在,这可能是有争议的,因为有时你可能不需要带熊猫来,但是,这取决于你正在处理的问题/要求的类型。用熊猫来可视化和处理数据通常更容易

我会让你来决定你是否想使用熊猫来完成这项任务,同时我会留下一个说明,说明你可以多么容易地将结果可视化,并用熊猫对结果进行排序

import pandas as pd

for obj in player_stats:    
    obj['Tournaments'] = pd.DataFrame(obj['Tournaments']).sort_values(['Date']).T.to_dict(orient='records')

加载字典列表并对其排序

单线解决方案如下:

pd.DataFrame(obj['Tournaments']).sort_values(['Date']).to_dict(orient='records')

让我们把它分解,了解它在做什么

A.对DataFrame

df = pd.DataFrame(obj['Tournaments']).sort_values(['Date'])
print(df) # print sorted dataframe

enter image description here

B.将DataFrame转换为dict

# convert DataFrame to dict
d = df.to_dict(orient='records') 
# print dictionary using json library
print(json.dumps(d, indent=2)

输出

[{'Date': '01-09-2020',
  'SG_Putting': 0.99,
  'Scrambling': '61.90',
  'Total_Putts_GIR': 85,
  'Tournament': 'Sony_Open'},
 {'Date': '01-30-2020',
  'SG_Putting': 1.1,
  'Scrambling': '68.75',
  'Total_Putts_GIR': 93,
  'Tournament': 'Waste_Management'},
 {'Date': '02-20-2020',
  'SG_Putting': -0.26,
  'Scrambling': '64.71',
  'Total_Putts_GIR': 70,
  'Tournament': 'WGC_Mexico'},
 {'Date': '06-11-2020',
  'SG_Putting': -1.45,
  'Scrambling': '57.14',
  'Total_Putts_GIR': 40,
  'Tournament': 'Charles_Schwab'},
 {'Date': '06-18-2020',
  'SG_Putting': 1.65,
  'Scrambling': '73.68',
  'Total_Putts_GIR': 82,
  'Tournament': 'RBC_Heritage'},
 {'Date': '07-02-2020',
  'SG_Putting': 0.34,
  'Scrambling': '66.67',
  'Total_Putts_GIR': 92,
  'Tournament': 'Rocket_Mortgage'},
 {'Date': '10-08-2019',
  'SG_Putting': 1.19,
  'Scrambling': '83.33',
  'Total_Putts_GIR': 101,
  'Tournament': 'Shriners_Hospital_for_Children_Open'}]

虚拟数据

为了再现性,我更愿意保留问题中提供的样本/虚拟数据以及用于回答的数据的记录

obj = {
    "Tournaments": [
      {
        "Scrambling": "61.90",
        "Total_Putts_GIR": 85,
        "SG_Putting": 0.99,
        "Tournament": "Sony_Open",
        "Date": "01-09-2020"
      },
      {
        "Scrambling": "68.75",
        "Total_Putts_GIR": 93,
        "SG_Putting": 1.1,
        "Tournament": "Waste_Management",
        "Date": "01-30-2020"
      },
      {
        "Scrambling": "64.71",
        "Total_Putts_GIR": 70,
        "SG_Putting": -0.26,
        "Tournament": "WGC_Mexico",
        "Date": "02-20-2020"
      },
      {
        "Scrambling": "57.14",
        "Total_Putts_GIR": 40,
        "SG_Putting": -1.45,
        "Tournament": "Charles_Schwab",
        "Date": "06-11-2020"
      },
      {
        "Scrambling": "73.68",
        "Total_Putts_GIR": 82,
        "SG_Putting": 1.65,
        "Tournament": "RBC_Heritage",
        "Date": "06-18-2020"
      },
      {
        "Scrambling": "66.67",
        "Total_Putts_GIR": 92,
        "SG_Putting": 0.34,
        "Tournament": "Rocket_Mortgage",
        "Date": "07-02-2020"
      },
      {
        "Scrambling": "83.33",
        "Total_Putts_GIR": 101,
        "SG_Putting": 1.19,
        "Tournament": "Shriners_Hospital_for_Children_Open",
        "Date": "10-08-2019"
      }
    ]
}

日期以字符串表示,并按字典顺序排序。这就是为什么,例如,'10-08-2019''07-02-2020'之后排序

一种解决方法是将字符串解析为datetime.datetime对象以进行排序

from datetime import datetime
...
        key=lambda x: datetime.strptime(x['Date'], '%m-%d-%Y')
        obj['Tournaments'].sort(key=key)

使用YYYYMMDD格式的排序键。(您的日期格式为MM-DD-YYYY。)

obj['Tournaments'].sort(key=lambda t:
                        t["Date"][6:] + t["Date"][:2] + t["Date"][3:5])

print(list(t["Date"] for t in obj["Tournaments"]))

给出:

['10-08-2019', '01-09-2020', '01-30-2020', '02-20-2020', '06-11-2020', '06-18-2020', '07-02-2020']

相关问题 更多 >