根据关键字值的优先级从列表中删除重复的字典



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

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

  1. 将字典列表转换为数据帧:

    import pandas as pd
    df = pd.DataFrame(iterlist)
    
  2. 创建映射dict:

    m = {'Admin': 3, 'Writer': 2, 'Reader': 1}
    
  3. 使用replace:创建优先级列

    df['pri'] = df['Type'].replace(m)
    
  4. pri得到sort_values,由Name得到groupby,只得到第一个元素:

    df = df.sort_values('pri', ascending=False).groupby('Name').first().reset_index()
    
  5. droppri列,并使用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'}])

最新更新