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

Python 过滤字典值列表中含0-20范围外数字的元组

二元元组字典的批量过滤实现

核心逻辑

遍历字典每个键对应的元组列表,逐个检查列表里的二元元组:只要元组内有任意一个整数不在有效范围内,就把这个元组删掉。
结合你给出的两组前后对比示例,整理出来的匹配规则是:

  • 元素小于0的元组必须删除
  • 元素等于20的元组必须删除
  • 两个元素都落在0到19闭区间的元组才保留
    如果你的实际需求是之前提到的0-20全闭区间(也就是等于20的元素也算合法),只需要调整判定条件的边界即可,整体代码逻辑不用动。

实现代码

方案1:生成新字典(保留原始数据)

适合需要留存原字典做对比、或者后续还要用原始数据的场景,逻辑清晰容易维护:

def check_tuple_valid(tup):
    # 这里的判断条件可以根据需求随时调整
    # 当前配置完全匹配你给出的示例过滤结果:元素需要满足 0 <= 值 < 20
    # 如果要改成0-20全闭区间,把 <20 换成 <=20 就行
    return all(0 <= num < 20 for num in tup)

# 测试用例就是你给的两组示例
original_dict = {
    (0, 0): [(1, 0), (-1, 0), (0, -1), (0, 1)],
    (19, 6): [(20, 6), (18, 6), (19, 5), (19, 7)]
}

# 字典推导式直接生成过滤后的新字典
filtered_dict = {
    key: [tup for tup in value_list if check_tuple_valid(tup)]
    for key, value_list in original_dict.items()
}

运行完得到的filtered_dict输出和你给的期望完全一致:

{
    (0, 0): [(1, 0), (0, 1)],
    (19, 6): [(18, 6), (19, 5), (19, 7)]
}

方案2:原地修改原字典(省内存)

适合原字典数据量特别大、多存一份副本会占太多内存的场景:

for key, value_list in original_dict.items():
    # 必须从后往前遍历删除,不然正向遍历删元素会因为列表前移漏检
    for index in range(len(value_list) - 1, -1, -1):
        if not check_tuple_valid(value_list[index]):
            del value_list[index]

注意点

  • 千万别正向遍历列表的时候边遍历边删元素:删了一个元素之后,后面的元素会往前挪一位,下次循环就会跳过本来要检查的位置,漏过无效元组
  • 范围调整的成本非常低:不管是要改有效区间的上下限,还是调整是否包含边界值,只需要改check_tuple_valid函数里的判断条件就行,不用碰主流程的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 12:06:07