Python如何高效筛选列表中键值匹配指定字符串的dict子集
问题修复与优化方案
问题根源
原代码使用in做子串匹配,会出现t1匹配到t100的错误,且每一轮筛选都全量遍历原始列表,存在冗余计算,效率较低。
优化思路
- 修正匹配规则:观察
t字段格式为ab_<标识>_<后缀>,拆分字符串取中间段做精准相等匹配,避免子串匹配错误。 - 降低时间复杂度:先遍历一次原始列表做分组缓存,后续直接从缓存取对应分组处理,无需重复遍历全量数据,数据量越大性能优势越明显。
实现代码
from collections import defaultdict nest_dict = [{'t': 'ab_t1_a', 'var': 1}, {'t': 'ab_t2_b', 'var': 22}, {'t': 'ab_t1_c', 'var': 3}, {'t': 'ab_t1_d', 'var': 4}, {'t': 'ab_t1_b', 'var': 2}, {'t': 'ab_t2_a', 'var': 11}, {'t': 'ab_t2_c', 'var': 33}, {'t': 'ab_t2_d', 'var': 44}, {'t': 'ab_t100_d', 'var': 100}] list_val = ['t1','t2','t100'] # 仅遍历一次原始数据做分组 group_cache = defaultdict(list) for item in nest_dict: t_tag = item['t'].split('_')[1] if t_tag in list_val: group_cache[t_tag].append(item) # 按要求生成结果 all_data = [] for tag in list_val: # 直接用字符串排序即可,无需转list sorted_list = sorted(group_cache[tag], key=lambda d: d['t']) all_data.append([x['var'] for x in sorted_list])
运行后all_data的输出为[[1, 2, 3, 4], [11, 22, 33, 44], [100]],符合预期。
额外说明
如果t字段的格式不固定,可替换匹配逻辑为正则精准提取,示例如下:
import re # 匹配_后接t加数字再接_的部分 pattern = re.compile(r'_(t\d+)_') t_tag = pattern.search(item['t']).group(1)
内容的提问来源于stack exchange,提问作者rpb
相关产品推荐
相关产品推荐

