Как удалить эти дубликаты в списке (python) - PullRequest
1 голос
/ 08 октября 2009
biglist = 

[ 

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

]

Я хотел бы удалить ТРЕТИЙ элемент в списке ... потому что он имеет "u2.com" в качестве дубликата. Я не хочу дублировать элемент "ссылка". Какой код наиболее эффективен для этого, чтобы он приводил к следующему:

biglist = 

[ 

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

Я пробовал много способов, включая использование множества вложенных «для ... в ....», но это очень неэффективно и слишком долго.

Ответы [ 5 ]

8 голосов
/ 08 октября 2009

Вероятно, самый быстрый подход для действительно большого списка, если вы хотите сохранить точный порядок оставшихся элементов, заключается в следующем ...:

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
3 голосов
/ 08 октября 2009

Создайте новый словарь, в котором ключами будут u2.com и abc.com, а элементами списка будут значения. Словарь обеспечит уникальность. Примерно так:

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

(есть обратное, так что первые элементы в списке будут теми, которые остаются в словаре. Если вы уберете это, то вместо этого вы получите последний элемент).

Затем вы можете получить элементы обратно в список следующим образом:

biglist = uniquelist.values()
2 голосов
/ 08 октября 2009

Вы можете отсортировать список, используя поле 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) для любой группы "дубликатов". Это верно, потому что алгоритм .sort(), используемый Python, гарантированно будет устойчивой сортировкой - он не меняет порядок элементов, определенных как равные друг другу (в этом случае, элементы с одинаковым link).

1 голос
/ 08 октября 2009
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 () сохраняет первый из любых дубликатов.

0 голосов
/ 08 октября 2009

Вы можете использовать defaultdict для группировки элементов по link, а затем удалить дубликаты, если хотите.

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']})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...