我仍然不太熟悉列表组成和内容,所以我很感激帮助。
我有一个字典列表,其中包含一个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'}]
我已经尝试了很多东西,但没有一个足够贴近这里以便修复。
感谢您的帮助,谢谢!
答案 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)