You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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)

代码说明

  1. itertools.combinations:生成所有长度为2的元素对,避免了双重循环中item1和item2、item2和item1的重复比较,提升了效率。
  2. 集合去重:同一个元素可能和多个元素符合阈值条件,用集合存储可以自动去重,确保每个疑似重复项只出现一次。
  3. 列表推导式:快速筛选出未被选中的剩余元素,代码简洁直观,可读性强。

这种实现方式比朴素的双重循环更高效、易维护,完全符合Pythonic的编程风格。

内容的提问来源于stack exchange,提问作者sailestim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 18:47:17