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

Python按值过滤字典列表:保留非重复标题的解决方法

解决字典列表按标题去重的问题

嘿,我来帮你搞定这个问题!你之前用的列表推导式[x for x in data if x['title'] not in data]没法工作,原因很简单——你是在判断标题字符串是否存在于字典列表里,这显然永远是True(因为列表里的元素是字典,不是字符串),所以过滤根本没生效。

下面给你两种靠谱的解决方法,都能实现保留首次出现的不重复标题字典的需求:

方法一:遍历+集合跟踪(可读性优先)

这种方法直观易懂,适合大多数场景,而且效率很高(集合的查询是O(1)时间复杂度):

data = [{'title':'XYZ','url':'www.xyz.com'},{'title':'ABC','url':'www.abc.com'},{'title':'XYZ','url':'www.def.com'}]

# 用集合记录已经见过的标题
seen_titles = set()
filtered = []

for item in data:
    title = item['title']
    if title not in seen_titles:
        seen_titles.add(title)
        filtered.append(item)

print(filtered)
# 输出: [{'title': 'XYZ', 'url': 'www.xyz.com'}, {'title': 'ABC', 'url': 'www.abc.com'}]

这个逻辑很清晰:逐个遍历列表里的字典,检查标题是否已经在seen_titles集合里,没见过的就把字典加入结果列表,同时把标题存入集合标记为已见过。

方法二:紧凑的列表推导式写法

如果你偏爱一行代码的简洁风格,可以用这个技巧,利用集合的add方法返回None的特性:

data = [{'title':'XYZ','url':'www.xyz.com'},{'title':'ABC','url':'www.abc.com'},{'title':'XYZ','url':'www.def.com'}]

seen = set()
filtered = [item for item in data if not (item['title'] in seen or seen.add(item['title']))]

print(filtered)
# 输出和上面一致

这里的逻辑是:

  • 如果标题已经在seen里,item['title'] in seen为True,整个条件就是not True,不加入列表
  • 如果标题没见过,item['title'] in seen为False,会执行seen.add(item['title'])(返回None),此时False or None是False,not False就是True,把字典加入列表

两种方法都能满足你的需求,第一种可读性更强,推荐日常使用;第二种适合追求代码简洁的场景。

内容的提问来源于stack exchange,提问作者Owais Arshad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:37:47