如果两个字典具有重复的键,从列表中删除字典。

4

我很不熟悉列表构成等技术,所以我感激您的帮助。

我有一个包含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个回答

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
这里有一种使用toolz.unique的方法。如果你没有这个第三方库,可以使用等效的unique_everseenitertools 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'}]

很好,谢谢你,这完全符合我的需求。我很感激。 - Canna

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)

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接