簡體   English   中英

如何從 Python 的對象列表中刪除具有相同“標題”字段的重復項?

[英]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)

使用更好的變量名稱,您的代碼也可能更易於閱讀; 什么是qListi


如果你想走列表理解路線,你可以用懶惰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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM