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
相关产品推荐
相关产品推荐

