[英]How to remove duplicates with the same 'title' field from object list in Python?
我有字段title
课程。 我也有对象列表,但有重复项。
for i in self.qList:
print(i.title)
给出:
War
Law
Mummy
War
War
我想从列表中删除War
,只留下一个。
我试过这个:
newlist=[]
for i in self.qList:
if i.title not in self.qList.title
newlist.append(i)
但得到了错误:
AttributeError: 'list' object has no attribute 'title'
最简单的方法是保留一set
标题,然后检查:
newlist = []
titles = set()
for i in self.qList:
if i.title not in titles:
newlist.append(i)
titles.add(i.title)
使用更好的变量名称,您的代码也可能更易于阅读; 什么是qList
或i
?
如果你想走列表理解路线,你可以用懒惰and
评估做一些偷偷摸摸的事情:
titles = set()
newlist = [i for i in self.qList if i.title not in titles and titles.add(i.title) is None]
我会让你弄清楚这是如何工作的!
对我来说看起来像是一个列表理解。
newlist = set(i.title for i in self.qList)
如果你真的想要一个列表,那么只需将它“投射”回来(好吧,它并不是真的在 python 中投射,但它看起来像)
newlist = list(set(i.title for i in self.qList))
此外,使用生成器表达式的一个小补充是没有“剩余的” i 变量,您实际上不需要任何东西。
编辑:上面不正确的解决方案是作为提醒我自己先阅读问题的。 提供对象的“基于生成器的解决方案”看起来更像是:
new_set = set(i.title for i in self.qList)
new_list = [i for i in self.qList if i.title in new_set]
我怀疑 python 对生成器和列表理解的优化仍然可以使其比循环更快,但两次访问i.title
属性是一种权衡。
我仍然有点喜欢它看起来更“pythonic”(性能问题待定...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.