如何根据给定值列表过滤字典值?代码错误修正求助
问题:过滤字典中的列表元素,保留指定列表内的项
原始数据:
my_list = ['white', 'grey', 'black'] my_dict = {'name1': ['green', 'yellow', 'orange', 'black'], 'name2': ['red', 'yellow', 'orange', 'purple', 'white', 'black'], 'name3': ['blue', 'red', 'grey', 'orange', 'black']}
期望得到过滤后的字典:
my_new_dict = {'name1': ['black'], 'name2': ['white', 'black'], 'name3': ['grey', 'black']}
尝试的代码:
my_new_dict = {} for k, v in my_dict.items(): for x in v: temp_list = list() if x in my_list: temp_list.append(x) my_new_dict[k] = temp_list
运行结果(仅保留最后一个匹配元素):
print(my_new_dict) {'name1': ['black'], 'name2': ['black'], 'name3': ['black']}
错误原因
你把temp_list = list()放在了内层循环(遍历列表元素的循环)里,导致每次遍历一个元素时都会重新创建空列表。即使前面匹配到了其他元素(比如name2里的white),也会被后续循环重新创建的空列表覆盖,最后只会保留最后一个匹配的元素(也就是每个列表末尾的black)。
修正后的代码
把temp_list的初始化移到外层循环(每个字典键的循环)里,这样每个键对应的列表会持续收集所有匹配的元素:
my_new_dict = {} for k, v in my_dict.items(): temp_list = list() # 每个键对应一个空列表,放在外层循环 for x in v: if x in my_list: temp_list.append(x) my_new_dict[k] = temp_list # 遍历完当前键的所有元素后,再赋值给字典
运行这段代码就能得到你期望的结果。
更简洁的写法(字典推导式)
用Python的字典推导式可以一行完成,更高效简洁:
my_new_dict = {k: [x for x in v if x in my_list] for k, v in my_dict.items()}
这种写法本质和上面的循环逻辑一致,但代码更紧凑,可读性也更强。
内容的提问来源于stack exchange,提问作者Kate
相关产品推荐
相关产品推荐

