我正在处理看起来像这样list的dict对象(对象的顺序不同):
list
dict
[ {'name': 'Foo', 'score': 1}, {'name': 'Bar', 'score': 2}, {'name': 'Foo', 'score': 3}, {'name': 'Bar', 'score': 3}, {'name': 'Foo', 'score': 2}, {'name': 'Baz', 'score': 2}, {'name': 'Baz', 'score': 1}, {'name': 'Bar', 'score': 1} ]
我想要做的是删除重复的名称,只保留每个名称中具有最高 的名称'score'。 上述列表的结果将是:
'score'
[ {'name': 'Baz', 'score': 2}, {'name': 'Foo', 'score': 3}, {'name': 'Bar', 'score': 3} ]
我不确定这里应该使用哪种模式(除了一个看似愚蠢的循环,它不断检查当前的是否dict已经'name'在列表中,然后检查它是否'score'高于现有的'score'。
'name'
创建一个空字典来存储每个唯一名称name以及具有score该名称最高值的对应字典。
name
score
对于列表中的每个项目,检查是否
已在字典中:
这里
data = [ {'name': 'Foo', 'score': 1}, { 'name': 'Bar', 'score': 2}, {'name': 'Foo', 'score': 3}, {'name': 'Bar', 'score': 3}, {'name': 'Foo', 'score': 2}, {'name': 'Baz', 'score': 2}, {'name': 'Baz', 'score': 1}, {'name': 'Bar', 'score': 1} ] # Dictionary to store the highest score for each name result = {} for item in data: name, score = item['name'], item['score'] # Update if name not in result or if the current score is higher than the stored one if name not in result or score > result[name]['score']: result[name] = item # Convert the dictionary values back into a list result_list = list(result.values()) print(result_list)
result
result.values()
对于提供的数据,此代码将输出:
[ {'name': 'Foo', 'score': 3}, {'name': 'Bar', 'score': 3}, {'name': 'Baz', 'score': 2} ]
该方法效率高并且避免了嵌套循环,比反复检查列表是否有重复更为优化。