Неразборчивый тип, удаляет дубликаты из коллекции, но сохраняет порядок ввода - PullRequest
0 голосов
/ 05 января 2019

Я ищу, чтобы удалить все дубликаты коллекции на основе ключа или комбинации клавиш.

Рассмотрим ниже список диктов:

c = [ {'a':1, 'b':2}, {'a':1, 'b':3}, {'a':1, 'b':2}, {'a':2, 'z':4}]

Желаемый вывод удалит дубликаты на основе ключа (ей). Для a вывод удаленных дубликатов:

[ {'a':1, 'b':2}, {'a':2, 'z':4}]

Для хэш-коллекции у меня работает следующий код:

def dups(seq):
    seen = []
    for item in seq:
        if item not in seen:
            seen.append(item)
    return seen

1 Ответ

0 голосов
/ 05 января 2019

Используйте OrderedDict, но хэш на frozenset s клавиш:

from collections import OrderedDict

o = OrderedDict((frozenset(d), d) for d in reversed(c))
uniq = list(o.values())[::-1]

print(uniq)
# [{'a': 1, 'b': 2}, {'a': 2, 'z': 4}]

Я перевожу c перед передачей его на OrderedDict, а затем переворачиваю извлеченные значения. Это гарантирует, что я удаляю дубликаты, сохраняя первый.


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

def dups(seq):
    seen = set()
    for item in seq:
        hashval = frozenset(item)
        if hashval not in seen:
            seen.add(hashval)
            yield item

uniq = list(dups(c))
print(uniq)
# [{'a': 1, 'b': 2}, {'a': 2, 'z': 4}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...