小能豆

给定一个字典列表,如何消除一个键的重复项,并按另一个键排序

py

我正在处理看起来像这样listdict对象(对象的顺序不同):

[
    {'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'。 上述列表的结果将是:

[
    {'name': 'Baz', 'score': 2},
    {'name': 'Foo', 'score': 3},
    {'name': 'Bar', 'score': 3}
]

我不确定这里应该使用哪种模式(除了一个看似愚蠢的循环,它不断检查当前的是否dict已经'name'在列表中,然后检查它是否'score'高于现有的'score'


阅读 17

收藏
2024-11-12

共1个答案

小能豆

  1. 创建一个空字典来存储每个唯一名称name以及具有score该名称最高值的对应字典。

  2. 对于列表中的每个项目,检查是否

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字典使用name作为键并存储根据该名称找到的分数最高的字典。
  • 循环遍历所有项目后,result.values()将包含具有唯一名称和最高分数的词典。

输出

对于提供的数据,此代码将输出:

[
    {'name': 'Foo', 'score': 3},
    {'name': 'Bar', 'score': 3},
    {'name': 'Baz', 'score': 2}
]

该方法效率高并且避免了嵌套循环,比反复检查列表是否有重复更为优化。

2024-11-12