You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据给定值列表过滤字典值?代码错误修正求助

问题:过滤字典中的列表元素,保留指定列表内的项

原始数据:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:15:48