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

如何按值列表过滤字典列表并去除重复项,保留指定键?

字典列表的过滤、去重与字段保留实现方案

问题背景

给定包含可变额外键值对的字典列表,以及一个大小写、长度可变的过滤列表,需要生成仅保留key1和key2字段、去除重复项且仅保留key1在过滤列表中的新字典列表。

原始数据示例:

data = [
    {'key1':'a', 'key2':'100', 'other_key':'val1'},
    {'key1':'b', 'key2':'50', 'another_key':'val2'},
    {'key1':'a', 'key2':'100', 'random_key':'val3'},
    {'key1':'b', 'key2':'50', 'some_key':'val4'},
    {'key1':'c', 'key2':'150', 'extra_key':'val5'},
    # ... 更多字典项
]

过滤列表示例:

filter_list = ['a', 'b']  # 避免使用内置函数名`filter`作为变量名

期望输出:

new_data = [{'key1':'a', 'key2':'100'}, {'key1':'b', 'key2':'50'}]

实现方法

方法一:集合跟踪去重(兼容所有Python版本)

通过集合记录已经处理过的(key1, key2)组合,遍历过程中筛选符合条件的项:

data = [
    {'key1':'a', 'key2':'100', 'other_key':'val1'},
    {'key1':'b', 'key2':'50', 'another_key':'val2'},
    {'key1':'a', 'key2':'100', 'random_key':'val3'},
    {'key1':'b', 'key2':'50', 'some_key':'val4'},
    {'key1':'c', 'key2':'150', 'extra_key':'val5'},
]
filter_list = ['a', 'b']

seen = set()
new_data = []
# 统一过滤列表的大小写,方便匹配
lower_filter = {item.lower() for item in filter_list}

for item in data:
    current_key1 = item['key1'].lower()
    current_key2 = item['key2']
    # 检查当前项的key1是否在过滤范围内
    if current_key1 in lower_filter:
        pair = (current_key1, current_key2)
        # 若该组合未出现过,则加入结果列表
        if pair not in seen:
            seen.add(pair)
            new_data.append({'key1': item['key1'], 'key2': item['key2']})

print(new_data)

说明:

  • 统一转为小写处理,解决过滤列表和数据中key1大小写不匹配的问题
  • 集合seen确保每个(key1, key2)组合仅被保留一次
  • 保留原始key1的大小写格式,若需要统一可修改new_data中的item['key1']为current_key1

方法二:字典推导式快速去重(Python 3.7+)

利用Python 3.7+字典保留插入顺序、键唯一的特性,一行推导式完成去重与筛选:

data = [
    {'key1':'a', 'key2':'100', 'other_key':'val1'},
    {'key1':'b', 'key2':'50', 'another_key':'val2'},
    {'key1':'a', 'key2':'100', 'random_key':'val3'},
    {'key1':'b', 'key2':'50', 'some_key':'val4'},
    {'key1':'c', 'key2':'150', 'extra_key':'val5'},
]
filter_list = ['a', 'b']

lower_filter = {x.lower() for x in filter_list}
# 用(key1小写, key2)作为临时字典的键,自动去重
temp_dict = {
    (item['key1'].lower(), item['key2']): {'key1': item['key1'], 'key2': item['key2']}
    for item in data
    if item['key1'].lower() in lower_filter
}
# 提取字典的值作为最终结果
new_data = list(temp_dict.values())

print(new_data)

说明:

  • 代码更简洁,执行效率较高
  • 同样支持大小写不敏感的过滤匹配
  • 保留原始插入顺序(Python 3.7+特性)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:54:59