如何按值列表过滤字典列表并去除重复项,保留指定键?
字典列表的过滤、去重与字段保留实现方案
问题背景
给定包含可变额外键值对的字典列表,以及一个大小写、长度可变的过滤列表,需要生成仅保留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
相关产品推荐
相关产品推荐

