假设我有以下类型的字典列表:
iterlist = [
{"Name": "Mike", "Type": "Admin"},
{"Name": "Mike", "Type": "Writer"},
{"Name": "Mike", "Type": "Reader"},
{"Name": "Zeke", "Type": "Writer"},
{"Name": "Zeke", "Type": "Reader"}
]
我想删除";名称";基于";类型";按以下优先级(管理员>写入程序>读取器(,因此最终结果应该是:
iterlist = [
{"Name": "Mike", "Type": "Admin"},
{"Name": "Zeke", "Type": "Writer"}
]
我发现了一个类似的问题,但它删除了一种显式键值类型的重复:链接
有人能指导我如何推进这项工作吗?
这是@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'}]
您也可以通过以下方式使用pandas
:
-
将字典列表转换为数据帧:
import pandas as pd df = pd.DataFrame(iterlist)
-
创建映射dict:
m = {'Admin': 3, 'Writer': 2, 'Reader': 1}
-
使用
replace
:创建优先级列df['pri'] = df['Type'].replace(m)
-
由
pri
得到sort_values
,由Name
得到groupby
,只得到第一个元素:df = df.sort_values('pri', ascending=False).groupby('Name').first().reset_index()
-
drop
pri
列,并使用to_dict
:返回字典df.drop('pri', axis='columns').to_dict(orient='records')
这将为您提供以下信息:
[{'Name': 'Mike', 'Type': 'Admin'}, {'Name': 'Zeke', 'Type': 'Writer'}]
以下是您可以尝试的解决方案,
unique = {}
for v in iterlist:
# check if key exists, if not update to `unique` dict
if not unique.get(v['Name']):
unique[v['Name']] = v
print(unique.values())
dict_values([{'Name': 'Mike', 'Type': 'Admin'}, {'Name': 'Zeke', 'Type': 'Writer'}])