基于列表元素值过滤字典:解决代码仅返回最后一个符合条件键值对的问题
问题:筛选字典中值列表元素≥30的键值对
你现有字典:
my_dict = {'mercury':[10], 'venus':[20], 'earth':[30],'mars':[40],'jupiter':[50],'saturn':[60]}
需要返回仅包含值(列表中的元素)大于等于30的键值对的字典,但目前编写的代码:
for k,v in my_dict.items(): for i in v: if i >= 30: new_dict = {k:v} print(new_dict)
运行后new_dict仅保留了最后一个符合条件的键值对,而非所有满足条件的键值对,该如何修改?
解决方案
我来帮你搞定这个问题!你遇到的核心问题是:每次循环时都重新创建了new_dict(直接赋值new_dict = {k:v}),而不是往已有的字典里添加键值对,所以最后只会留下最后一次循环的结果。下面给你两种可行的修改方式:
方法1:初始化空字典后逐步添加键值对
先创建一个空字典,当找到符合条件的键值对时,把它添加到这个空字典中,而不是重新赋值:
my_dict = {'mercury':[10], 'venus':[20], 'earth':[30],'mars':[40],'jupiter':[50],'saturn':[60]} new_dict = {} # 先初始化空字典 for k, v in my_dict.items(): for i in v: if i >= 30: new_dict[k] = v # 往字典里添加符合条件的键值对 break # 因为你的每个值都是单元素列表,找到符合条件的就可以跳出内层循环,提升效率 print(new_dict)
运行后会输出:{'earth': [30], 'mars': [40], 'jupiter': [50], 'saturn': [60]},这正是你想要的结果。
方法2:用字典推导式(更简洁)
如果你喜欢更简洁的写法,可以用Python的字典推导式,一行代码就能搞定:
my_dict = {'mercury':[10], 'venus':[20], 'earth':[30],'mars':[40],'jupiter':[50],'saturn':[60]} new_dict = {k: v for k, v in my_dict.items() if any(i >= 30 for i in v)} print(new_dict)
补充说明:
any(i >= 30 for i in v)用来判断列表v中是否存在至少一个元素≥30,只要有一个符合就保留该键值对;- 如果你的需求是列表中所有元素都要≥30才保留,只需把
any()换成all()即可。
内容的提问来源于stack exchange,提问作者Retsi
相关产品推荐
相关产品推荐

