如何简洁高效地实现:根据列表元素匹配字典值并返回对应键?
更简洁高效的实现方案
原嵌套循环的写法虽然可行,但时间复杂度为O(M*N)(M是search_list长度,N是字典键的数量),当数据规模较大时效率偏低。下面提供两种更优的实现方式:
1. 构建反向映射字典(推荐,高效)
先把原字典的「标签-缩写列表」结构反转成「缩写-标签」的一对一映射,之后直接通过索引查找,时间复杂度可降至O(K+M)(K是所有缩写的总数量),适合大规模数据场景。
my_dict = { 'NONE': ['N', 'NE'], 'VERY SLIGHT': ['VSLT', 'VT'], 'SLIGHT': ['SLT', 'ST'], 'FAINT': ['F', 'FT'], 'MEDIUM': ['M', 'MM'], 'STRONG': ['S', 'SG'], 'VERY STRONG': ['VS', 'VG'] } search_list = ['N', 'SLT', 'MM'] # 构建反向映射:每个缩写对应唯一标签 reverse_map = {abbr: label for label, abbrs in my_dict.items() for abbr in abbrs} # 生成结果列表 result_list = [reverse_map[item] for item in search_list] print(result_list) # 输出: ['NONE', 'SLIGHT', 'MEDIUM']
如果search_list中可能存在不在字典里的元素,可以用get方法避免KeyError:
# 过滤掉不存在的元素,或指定默认值 result_list = [reverse_map.get(item) for item in search_list if reverse_map.get(item)]
2. 生成器表达式结合next()(简洁,适合小数据量)
如果不想额外构建映射字典,也可以用生成器表达式配合next()函数实现一行式写法,不过时间复杂度仍为O(M*N),适合数据量较小的场景:
result_list = [next(k for k, v in my_dict.items() if item in v) for item in search_list]
若要处理不存在的元素,可添加默认值:
# 不存在的元素返回None result_list = [next((k for k, v in my_dict.items() if item in v), None) for item in search_list]
内容的提问来源于stack exchange,提问作者BKP
相关产品推荐
相关产品推荐

