Удалить словарь из списка, если два словаря имеют повторяющиеся ключи - PullRequest
0 голосов
/ 06 июня 2018

Я все еще не слишком знаком с составом списка и прочим, поэтому я благодарен за помощь.

У меня есть список словарей, которые содержат URL-адрес и число в каждом словаре, например:

data = [{'url': 'www.url1.com', 'max': '14.6'},
        {'url': 'www.url2.com', 'max': '17.8'},
        {'url': 'www.url2.com', 'max': '18.4'},
        {'url': 'www.url3.com', 'max': '15.5'}]

Я бы хотел отфильтровать все словари с дубликатом ключа url, даже если ключ max отличается от другого дублированного элемента.

Мой ожидаемый результат будет:

data = [{'url': 'www.url1.com', 'max': '14.6'},
        {'url': 'www.url2.com', 'max': '17.8'},
        {'url': 'www.url3.com', 'max': '15.5'}]

Я пробовал довольно много вещей, но ни одна из них не была достаточно близкой, чтобы опубликовать здесь, чтобы исправить.

Я ценю вашу помощь, спасибо!

Ответы [ 4 ]

0 голосов
/ 06 июня 2018

Попробуйте создать словарь, затем получить его значения и преобразовать в список:

data = [{'url': 'www.url1.com', 'max': '14.6'},
        {'url': 'www.url2.com', 'max': '17.8'},
        {'url': 'www.url2.com', 'max': '18.4'},
        {'url': 'www.url3.com', 'max': '15.5'}]
print(list({v['url']:v for v in data}.values()))

Вывод:

[{'url': 'www.url1.com', 'max': '14.6'}, {'url': 'www.url2.com', 'max': '18.4'}, {'url': 'www.url3.com', 'max': '15.5'}]
0 голосов
/ 06 июня 2018

Для метода чистого питона:

data = [{'url': 'www.url1.com', 'max': '14.6'},
        {'url': 'www.url2.com', 'max': '17.8'},
        {'url': 'www.url2.com', 'max': '18.4'},
        {'url': 'www.url3.com', 'max': '15.5'}]

seen_before = []
for d in data:
    if d['url'] not in seen_before:
        seen_before.append(d['url'])
print(seen_before)
0 голосов
/ 06 июня 2018

Я думаю, что простая функция, представленная ниже, удовлетворит ваши потребности.

def clean_data(data):
    new_data = []
    urls = [] 
    for rec in data:
        rec_url = rec.get("url")
        if not rec_url in urls:
            urls.append(rec_url)
            new_data.append(rec)
        else:
            pass
    return new_data

clean_data(data)
0 голосов
/ 06 июня 2018

Вот один из способов использования toolz.unique.Если у вас нет этой сторонней библиотеки, вы можете использовать эквивалентный unique_everseen рецепт itertools :

from toolz import unique
from operator import itemgetter

res = list(unique(data, key=itemgetter('url')))

print(res)

[{'url': 'www.url1.com', 'max': '14.6'},
 {'url': 'www.url2.com', 'max': '17.8'},
 {'url': 'www.url3.com', 'max': '15.5'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...