基于Area和Price阈值筛选字典列表的Pythonic实现问询
问题描述
我有一个字典列表:
[{"Name": 'A', "Area": 10000, "Price": 100}, {"Name": 'B', "Area": 9500, "Price": 99}, {"Name": 'C', "Area": 11000, "Price": 101}, {"Name": 'D', "Area": 12000, "Price": 150}, {"Name": 'E', "Area": 14000, "Price": 200}, {"Name": 'F', "Area": 14500, "Price": 400}, {"Name": 'G', "Area": 12999, "Price": 159}]
我希望基于Area和Price两个键的阈值条件生成两个新的字典列表,本次示例中Area阈值为1000,Price阈值为10,预期得到以下两个列表:
符合阈值的疑似重复项列表
[{"Name": 'A', "Area": 10000, "Price": 100}, # 和B、C的Area差小于1000且Price差小于10 {"Name": 'B', "Area": 9500, "Price": 99}, # 和A、C符合阈值 {"Name": 'C', "Area": 11000, "Price": 101}, # 和A、B符合阈值 {"Name": 'D', "Area": 12000, "Price": 150}, # 和G符合阈值,但和C的Price差超过10 {"Name": 'G', "Area": 12999, "Price": 159}] # 和D符合阈值
剩余项列表(未被选为疑似重复项)
[{"Name": 'E', "Area": 14000, "Price": 200}, # 未选中是因为和其他项的Price差都超过10 {"Name": 'F', "Area": 14500, "Price": 400}] # 同理
目前我只会用双重循环逐一比较元素的Area和Price值的朴素解法,想知道更Pythonic的实现方式。
解决方案
可以利用itertools.combinations生成所有不重复的元素对,结合集合自动去重的特性来筛选疑似重复项,最后用列表推导式快速提取剩余元素。这种方式代码更简洁高效,也更贴合Python的风格。
示例代码
from itertools import combinations data = [ {"Name": 'A', "Area": 10000, "Price": 100}, {"Name": 'B', "Area": 9500, "Price": 99}, {"Name": 'C', "Area": 11000, "Price": 101}, {"Name": 'D', "Area": 12000, "Price": 150}, {"Name": 'E', "Area": 14000, "Price": 200}, {"Name": 'F', "Area": 14500, "Price": 400}, {"Name": 'G', "Area": 12999, "Price": 159} ] area_threshold = 1000 price_threshold = 10 # 用集合存储符合条件的元素,自动去重 suspects = set() # 生成所有不重复的元素对,避免重复比较 for item1, item2 in combinations(data, 2): area_diff = abs(item1["Area"] - item2["Area"]) price_diff = abs(item1["Price"] - item2["Price"]) if area_diff <= area_threshold and price_diff <= price_threshold: suspects.add(item1) suspects.add(item2) # 转换为列表格式 suspect_list = list(suspects) # 筛选未被标记为疑似重复的元素 remaining_list = [item for item in data if item not in suspects] # 输出结果 print("疑似重复项列表:") for item in suspect_list: print(item) print("\n剩余项列表:") for item in remaining_list: print(item)
代码说明
itertools.combinations:生成所有长度为2的元素对,避免了双重循环中item1和item2、item2和item1的重复比较,提升了效率。- 集合去重:同一个元素可能和多个元素符合阈值条件,用集合存储可以自动去重,确保每个疑似重复项只出现一次。
- 列表推导式:快速筛选出未被选中的剩余元素,代码简洁直观,可读性强。
这种实现方式比朴素的双重循环更高效、易维护,完全符合Pythonic的编程风格。
内容的提问来源于stack exchange,提问作者sailestim
相关产品推荐
相关产品推荐

