如何基于列表条件筛选字典元素,生成符合要求的新字典?
问题描述
现有如下结构的字典:
features_id = { 'id1': ['a', 'b', 'c', 'd'], 'id2': ['c', 'd'], 'id3': ['a', 'e', 'f', 'd', 'g', 'k'], # 更多键值对... }
同时有一个用于过滤的列表:
list_of_values = ['a', 'c']
需要生成新字典,每个键对应的列表仅保留存在于list_of_values中的元素,最终结构如下:
new_dict = { 'id1': ['a', 'c'], 'id2': ['c'], 'id3': ['a'], # 更多键值对... }
解决方案
可以用字典推导式快速实现,为了提升查找效率,建议先把list_of_values转换成集合(集合的成员查询时间复杂度是O(1),比列表的O(n)更高效,尤其当过滤列表元素较多时)。
代码示例:
features_id = { 'id1': ['a', 'b', 'c', 'd'], 'id2': ['c', 'd'], 'id3': ['a', 'e', 'f', 'd', 'g', 'k'], } list_of_values = ['a', 'c'] # 转换为集合提升查询效率 value_set = set(list_of_values) # 字典推导式生成新字典 new_dict = {key: [item for item in values if item in value_set] for key, values in features_id.items()} print(new_dict)
运行结果:
{'id1': ['a', 'c'], 'id2': ['c'], 'id3': ['a']}
逻辑说明
- 将
list_of_values转为集合value_set,优化元素查询速度; - 遍历原字典
features_id的每一组键值对; - 对每个键对应的列表,用列表推导式筛选出存在于
value_set中的元素; - 将筛选后的列表与原键配对,构建成新字典。
内容的提问来源于stack exchange,提问作者Pybubb
相关产品推荐
相关产品推荐

