Удалите повторяющиеся записи из вложенного словаря, если два значения совпадают, в Python - PullRequest
3 голосов
/ 05 ноября 2010

Рассмотрим этот формат словаря.

{1:{'name':'chrome', 'author':'google', 'url':'http://www.google.com/' },
 2:{'name':'firefox','author':'mozilla','url':'http://www.mozilla.com/'}}

Я хочу удалить все элементы с одинаковыми именем и автором.

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

Ответы [ 2 ]

3 голосов
/ 05 ноября 2010

Итерация по словарю, отслеживание найденных (name, author) кортежей по мере продвижения и удаление тех, с которыми вы уже столкнулись:

def remove_duplicates(d):
    encountered_entries = set()
    for key, entry in d.items():
        if (entry['name'], entry['author']) in encountered_entries:
            del d[key]
        else:
            encountered_entries.add((entry['name'], entry['author']))
1 голос
/ 05 ноября 2010

Посмотрим, сработает ли это ...

from itertools import groupby

def entry_key(entry):
    key, value = entry
    return (value['name'], value['author'])

def nub(d):
    items = d.items()
    items.sort(key=entry_key)
    grouped = groupby(items, entry_key)
    return dict([grouper.next() for (key, grouper) in grouped])
...