Python列表字典按n、r、sd键对比删除低v值字典的实现方法
实现方案
核心逻辑为:以n、r、sd三个值组成的可哈希元组作为分组键,遍历所有字典项时仅保留每个分组中v值最大的条目,最终提取所有分组的保留条目即可得到结果。
可直接运行的代码
# 原数据需将null替换为Python可识别的None ab = [ { 'n': 'abc', 'r': 'PHX', 'sd': 'cert', 'dd': None, 'TimeCreated': 1627298805136, 'v': 2, 'o': 'symrxt7mhzuu3o5kq' }, { 'n': 'abc', 'r': 'PHX', 'sd': 'cert', 'dd': None, 'TimeCreated': 1631868530689, 'v': 3, 'o': '52cf7qrfdalpa' }, { 'n': 'def', 'r': 'ASHBURN', 'sd': 'cert', 'dd': None, 'TimeCreated': 1628827511212, 'v': 2, 'o': 'mjmbw2oabhxiq' }, { 'n': 'def-kup', 'r': 'ASHBURN', 'sd': 'cert', 'dd': None, 'TimeCreated': 1598527021488, 'v': 1, 'o': '5a' }, { 'n': 'ghi', 'r': 'AP_SYDNEY_1', 'sd': 'cert', 'dd': None, 'TimeCreated': 1610377812778, 'v': 1, 'o': '2zy' }, { 'n': 'ghi', 'r': 'AP_SYDNEY_1', 'sd': 'cert', 'dd': None, 'TimeCreated': 1631877819065, 'v': 2, 'o': 'ongu7be56y7cc' }, { 'n': 'jkl', 'r': 'EU_FRANKFURT_1', 'sd': 'cert', 'dd': None, 'TimeCreated': 1611334435645, 'v': 1, 'o': 'xpa' }, { 'n': 'jkl', 'r': 'EU_FRANKFURT_1', 'sd': 'cert', 'dd': None, 'TimeCreated': 1631879049498, 'v': 2, 'o': '57nrzqhrmwa' } ] temp = {} for item in ab: # 构造分组唯一标识 key = (item['n'], item['r'], item['sd']) if key not in temp or item['v'] > temp[key]['v']: temp[key] = item # 最终结果 res = list(temp.values()) # 打印验证结果 import json print(json.dumps(res, indent=2, ensure_ascii=False))
补充说明
- 若同分组内出现多个
v值相同且均为最大值的条目,上述代码默认保留第一个遍历到的条目,可根据需求调整替换规则。 - 时间复杂度为O(n),仅需遍历一次原列表即可完成处理,效率远高于嵌套循环两两对比的方案。
内容的提问来源于stack exchange,提问作者Suzana
相关产品推荐
相关产品推荐

