簡體   English   中英

如何在列表中刪除這些重復項(Python)

[英]How to remove these duplicates in a list (python)

biglist = 

[ 

    {'title':'U2 Band','link':'u2.com'}, 
    {'title':'ABC Station','link':'abc.com'}, 
    {'title':'Live Concert by U2','link':'u2.com'} 

]

我想刪除列表中的THIRD元素...因為它具有重復的“ u2.com”。 我不想重復的“鏈接”元素。 這樣做最有效的代碼是什么:

biglist = 

[ 

    {'title':'U2','link':'u2.com'}, 
    {'title':'ABC','link':'abc.com'}
]

我嘗試了許多方法,包括使用許多嵌套的“ for ... in ....”,但這效率很低而且太長。

對於一個很大的列表,如果您想保留剩余項目的確切順序,可能是最快的方法如下:

biglist = [ 
    {'title':'U2 Band','link':'u2.com'}, 
    {'title':'ABC Station','link':'abc.com'}, 
    {'title':'Live Concert by U2','link':'u2.com'} 
]

known_links = set()
newlist = []

for d in biglist:
  link = d['link']
  if link in known_links: continue
  newlist.append(d)
  known_links.add(link)

biglist[:] = newlist

制作一個新字典,用'u2.com'和'abc.com'作為鍵,並使用列表元素作為值。 字典將強制唯一性。 像這樣:

uniquelist = dict((element['link'], element) for element in reversed(biglist))

(存在相反的內容,因此列表中的第一個元素將是保留在字典中的元素。如果將其刪除,則將獲得最后一個元素)。

然后,您可以將元素重新放入這樣的列表中:

biglist = uniquelist.values()

您可以使用每個字典的link字段作為排序關鍵字對列表進行排序,然后遍歷列表一次並刪除重復項(或者,如Python習慣用法一樣,創建一個刪除重復項的新列表),如下所示:

# sort the list using the 'link' item as the sort key
biglist.sort(key=lambda elt: elt['link'])

newbiglist = []
for item in biglist:
    if newbiglist == [] or item['link'] != newbiglist[-1]['link']:
        newbiglist.append(item)

這段代碼將為您提供任何“重復項”組的第一個元素(原始biglist中的相對順序)。 之所以如此,是因為Python使用的.sort()算法保證是穩定的排序-它不會更改確定為彼此相等的元素的順序(在這種情況下,元素具有相同的link )。

biglist = \
[ 
    {'title':'U2 Band','link':'u2.com'}, 
    {'title':'ABC Station','link':'abc.com'}, 
    {'title':'Live Concert by U2','link':'u2.com'} 
]

def dedupe(lst):
    d = {}
    for x in lst:
        link = x["link"]
        if link in d:
            continue
        d[link] = x
    return d.values()

lst = dedupe(biglist)

dedupe()保留所有重復項中的第一個。

您可以使用defaultdictlink對項目進行分組,然后根據需要刪除重復項。

from collections import defaultdict

nodupes = defaultdict(list)
for d in biglist:
    nodupes[d['url']].append(d['title']

這將為您提供:

defaultdict(<type 'list'>, {'abc.com': ['ABC Station'], 'u2.com': ['U2 Band', 
'Live Concert by U2']})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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