如果两个词典具有重复键,则从列表中删除词典

时间:2018-06-05 23:47:43

标签: python python-3.x list dictionary

我仍然不太熟悉列表组成和内容,所以我很感激帮助。

我有一个字典列表,其中包含一个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 :(得分:2)

尝试创建字典理解,然后获取它的值,然后将其转换为列表:

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'}]

答案 1 :(得分:1)

这是使用toolz.unique的单向方式。如果您没有此第三方库,则可以使用等效的unique_everseen itertools recipe

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'}]

答案 2 :(得分:0)

对于纯python方法:

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)

答案 3 :(得分:0)

我认为下面的简单功能可以满足您的需求。

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)