Python如何按首元素分组、日期排序嵌套列表并更新Rank值
问题描述
现有输入数据
ArrayData = [['a', 'ad', '02/10/2021 7:39:19 am', 'Rank:1'], ['b', 'db', '02/10/2021 6:25:20 am', 'Rank:2'], ['a', 'sd', '02/10/2021 5:39:19 am', 'Rank:3'], ['b', 'esas', '02/10/2021 6:25:20 am', 'Rank:1'], ['a', 'aser', '02/10/2021 9:39:19 am', 'Rank:2'], ['d', 'ssss', '02/10/2021 11:39:19 am', 'Rank:1']]
需求说明
- 子列表按第一个元素分组,各组默认按首元素字母升序(a<b<c<d)排列
- 同组内按第三个字段的日期时间倒序排序,时间越新排名越高
- 按排序结果更新每个子列表末尾的Rank值,组内第一名标
Rank:1,后续依次递增
现有代码问题
当前仅能全局按时间字段排序,没有实现分组、组内排名更新的逻辑,且直接对时间字符串排序可能出现格式匹配错误。
优化后实现代码
from collections import defaultdict from datetime import datetime ArrayData = [['a', 'ad', '02/10/2021 7:39:19 am', 'Rank:1'], ['b', 'db', '02/10/2021 6:25:20 am', 'Rank:2'], ['a', 'sd', '02/10/2021 5:39:19 am', 'Rank:3'], ['b', 'esas', '02/10/2021 6:25:20 am', 'Rank:1'], ['a', 'aser', '02/10/2021 9:39:19 am', 'Rank:2'], ['d', 'ssss', '02/10/2021 11:39:19 am', 'Rank:1']] # 1、按首元素分组 group_dict = defaultdict(list) for item in ArrayData: group_dict[item[0]].append(item) result = [] # 2、按组名升序遍历所有分组 for group_key in sorted(group_dict.keys()): # 3、同组内按时间倒序排序,先把时间字符串转成datetime对象避免排序错误 sorted_group = sorted( group_dict[group_key], key=lambda x: datetime.strptime(x[2].strip(), '%d/%m/%Y %I:%M:%S %p'), reverse=True ) # 4、更新组内Rank for idx, item in enumerate(sorted_group): item[-1] = f'Rank:{idx+1}' # 5、把处理好的组加入最终结果 result.extend(sorted_group) # 如果需要最终结果全局按时间倒序排列,取消注释下面这行即可匹配你给出的预期输出顺序 # result = sorted(result, key=lambda x: datetime.strptime(x[2].strip(), '%d/%m/%Y %I:%M:%S %p'), reverse=True) print(result)
代码说明
- 用
defaultdict实现按首元素分组,逻辑清晰易维护 - 时间排序前先转成
datetime对象,避免字符串直接排序的格式兼容问题 - 组内排序后直接通过索引更新Rank值,符合需求规则
- 额外保留了全局按时间倒序的可选逻辑,取消对应注释即可匹配你给出的预期输出顺序
内容的提问来源于stack exchange,提问作者liuxu
相关产品推荐
相关产品推荐

