Python嵌套列表按key分组:Yes项求和后叠加Non项离零最远值的实现
Python嵌套列表分组累加+极值叠加实现方案
你的原有实现存在一个小漏洞:如果分组内第一个出现的元素标记为Non,初始化时会直接将该元素的第2、3位作为初始累加值,不符合仅对Yes标记元素求和的要求。
以下是符合需求的完整实现代码:
example = [[2, 2, -10, 'Yes'], [2, 8, 21, 'Yes'], [2, 19, 14, 'Non'], [2, 30, -22, 'Non'], [4, -15, 31, 'Yes'], [4, 2, 17, 'Yes'], [4, 3, -90, 'Non']] dictsum = {} for item in example: key = item[0] val1 = item[1] val2 = item[2] flag = item[3] # 初始化分组结构:[yes_val1总和, yes_val2总和, non_val1列表, non_val2列表] if key not in dictsum: dictsum[key] = [0, 0, [], []] if flag == "Yes": dictsum[key][0] += val1 dictsum[key][1] += val2 else: dictsum[key][2].append(val1) dictsum[key][3].append(val2) # 组装最终结果,叠加Non分组的最远零值 result = [] for k, v in dictsum.items(): # 找val1离零最远的值(绝对值最大),无Non元素时默认加0 max_val1 = max(v[2], key=abs) if v[2] else 0 # 找val2离零最远的值,无Non元素时默认加0 max_val2 = max(v[3], key=abs) if v[3] else 0 result.append([k, v[0] + max_val1, v[1] + max_val2]) print(result) # 输出:[[2, 40, -11], [4, -10, -42]]
可选优化建议
- 若要简化字典存在性判断的逻辑,可以使用Python标准库的
collections.defaultdict,初始化代码可简化为:
from collections import defaultdict dictsum = defaultdict(lambda: [0, 0, [], []])
- 代码内置了空列表兼容逻辑,若某个分组下没有
Non标记的元素,会自动叠加0不会报错,适配更多场景。
内容的提问来源于stack exchange,提问作者DaniV
相关产品推荐
相关产品推荐

