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

oro*_*aki 11 python sorting algorithm list

我有工作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}
]
Run Code Online (Sandbox Code Playgroud)

我想要做的是删除重复的名称,只保留每个名称中最高的名称之一'score'.上面列表的结果将是:

[
    {'name': 'Baz', 'score': 2},
    {'name': 'Foo', 'score': 3},
    {'name': 'Bar', 'score': 3}
]
Run Code Online (Sandbox Code Playgroud)

我不知道在这里使用的模式(除了一个看似愚蠢的循环,不断检查当前dict'name'在列表中已经然后检查其是否'score'比现有的更高'score'.

JBe*_*rdo 15

一种方法是:

data = collections.defaultdict(list)
for i in my_list:
    data[i['name']].append(i['score'])
output = [{'name': i, 'score': max(j)} for i,j in data.items()]
Run Code Online (Sandbox Code Playgroud)

所以输出将是:

[{'score': 2, 'name': 'Baz'},
 {'score': 3, 'name': 'Foo'},
 {'score': 3, 'name': 'Bar'}]
Run Code Online (Sandbox Code Playgroud)

  • 我从中学到了很多关于Python的知识,谢谢 (2认同)

Ray*_*ger 10

这里不需要defaultdicts或sets.你可以使用简单的单词和列表.

汇总字典中的最佳运行分数并将结果转换回列表:

>>> s = [
    {'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}
]
>>> d = {}
>>> for entry in s:
        name, score = entry['name'], entry['score']
        d[name] = max(d.get(name, 0), score)

>>> [{'name': name, 'score': score} for name, score in d.items()]
[{'score': 2, 'name': 'Baz'}, {'score': 3, 'name': 'Foo'}, {'score': 3, 'name': 'Bar'}]
Run Code Online (Sandbox Code Playgroud)