首页 > 解决方案 > 按优先级根据键值从列表中删除重复字典

问题描述

假设我有以下类型的字典列表:

iterlist = [
    {"Name": "Mike", "Type": "Admin"},
    {"Name": "Mike", "Type": "Writer"},
    {"Name": "Mike", "Type": "Reader"},
    {"Name": "Zeke", "Type": "Writer"},
    {"Name": "Zeke", "Type": "Reader"}
]

我想按以下优先级(Admin > Writer > Reader)根据“类型”删除重复的“名称”,所以最终结果应该是:

iterlist = [
    {"Name": "Mike", "Type": "Admin"},
    {"Name": "Zeke", "Type": "Writer"}
]

我发现了一个类似的问题,但它删除了一种显式键值类型的重复项:链接

有人可以指导我如何继续前进吗?

标签: pythonlistdictionaryduplicates

解决方案


这是@azro建议的解决方案的修改形式,他们的解决方案和其他解决方案没有考虑到您提到的优先级,您可以使用以下代码克服它。有一个优先级的字典。

iterlist = [
    {"Name": "Mike", "Type": "Writer"},
    {"Name": "Mike", "Type": "Reader"},
    {"Name": "Mike", "Type": "Admin"},
    {"Name": "Zeke", "Type": "Reader"},
    {"Name": "Zeke", "Type": "Writer"}
]

# this is used to get the priority
priorites = {i:idx for idx, i in enumerate(['Admin', 'Writer', 'Reader'])}

sort_key = lambda x:(x['Name'], priorites[x['Type']])
groupby_key = lambda x:x['Name']

result = [next(i[1]) for i in groupby(sorted(iterlist, key=sort_key), key=groupby_key)]
print(result)

输出

[{'Name': 'Mike', 'Type': 'Admin'}, {'Name': 'Zeke', 'Type': 'Writer'}]

推荐阅读