如何按元组首元素分组取每组末元素最大项,可通过字典实现吗?
完全可以通过字典实现,实现逻辑非常简洁,时间复杂度仅为O(n),比用pandas处理的性能更高。
实现思路
- 以元组的第一个元素作为字典的key,每个key对应的值为当前分组内最后一位元素最大的元组
- 一次遍历所有元组,对每个元组做如下判断:
- 若当前key不在字典中,直接存入当前元组
- 若当前key已存在,对比当前元组和字典中存储元组的最后一位数值,若当前元组的数值更大则替换字典中的存储值
- 遍历完成后直接取出字典的所有值,即为最终结果
可直接运行的代码
def get_target_tuples(tuples_list): group_dict = {} for tpl in tuples_list: key = tpl[0] current_last = tpl[-1] if key not in group_dict: group_dict[key] = tpl else: # 如果相同最大值需要保留后出现的元组,把>改成>=即可 if current_last > group_dict[key][-1]: group_dict[key] = tpl return list(group_dict.values()) # 测试示例 A = [(1, 3, 5, 6, 6), (0, 1, 2, 4, 5), (1, 9, 8, 3, 5), (0, 2, 3, 5, 7)] print(get_target_tuples(A)) # 输出:[(1, 3, 5, 6, 6), (0, 2, 3, 5, 7)] 完全符合预期
原pandas代码错误原因说明
你原来的代码中grouped_data.max(4)的写法是错误的,max()方法的参数是numeric_only,不是指定按第4列求最大值,调用该方法会对分组内所有列分别求最大值再拼接成新行,不是你需要的「找到最后一列最大的整行数据」。如果要使用pandas实现,正确写法可以参考:
import pandas as pd def f(sample): data = pd.DataFrame(sample) # 先按最后一列降序排序,再按分组去重,保留每组第一个(也就是最后一列最大的)行 result = data.sort_values(by=data.columns[-1], ascending=False).drop_duplicates(subset=0, keep='first') return list(result.to_records(index=False))
内容的提问来源于stack exchange,提问作者Cooper
相关产品推荐
相关产品推荐

