【问题标题】:How do I check for duplicate dictionaries by a key and remove the dictionaries by a different key?如何通过一个键检查重复的字典并通过不同的键删除字典?
【发布时间】:2021-03-05 19:34:31
【问题描述】:

如何通过“首字母”键检查重复字典并删除“分数”键最低的重复字典?

代码:

scores = [{'initials': 'AS', 'score': 87},
          {'initials': 'AS', 'score': 23},
          {'initials': 'WI', 'score': 43},
          {'initials': 'WI', 'score': 98}]

(code goes here)

print(scores)

预期输出:

[{'initials': 'AS', 'score': 87},
 {'initials': 'WI', 'score': 98}],

编辑:我现在意识到我应该展示我当前对该问题的尝试,但问题得到了解决。对于我的下一个问题,我将展示我的尝试。谢谢你的回答!

【问题讨论】:

标签: python list sorting dictionary


【解决方案1】:

这又是一个您希望按一个键分组然后聚合其他键的示例,在这种情况下,您的聚合是采用其他键的max。所以使用字典分组习语

>>> grouper = {}
>>> for d in scores:
...     key = d['initials']
...     if key in grouper:
...         grouper[key] = max(grouper[key], d['score'])
...     else:
...         grouper[key] = d['score']
...
>>> grouper
{'AS': 87, 'WI': 98}

此时,此字典可能是更适合您所需的数据结构。但是如果你真的必须有一个字典列表,你可以转换上面的:

>>> [dict(initials=k, score=v) for k,v in grouper.items()]
[{'initials': 'AS', 'score': 87}, {'initials': 'WI', 'score': 98}]

【讨论】:

    【解决方案2】:
    scores = [{'initials': 'AS', 'score': 87}, {'initials': 'AS', 'score': 23}, 
    {'initials': 'WI', 'score': 43}, {'initials': 'WI', 'score': 98}]
    
    
    dict_of_dict = dict()
    for dic in scores:
        if dic['initials'] not in dict_of_dict:
            dict_of_dict[dic['initials']] = dic
        else:
            if dic['score'] > dict_of_dict[dic['initials']]['score']:
                dict_of_dict[dic['initials']] = dic
        
    scores = list(dict_of_dict.values())
    

    这更像是保留得分最高的那个。我想这正是你的意思。

    【讨论】:

    • 这非常有效。感谢您的贡献!
    • 你的变量命名也被诅咒了,我喜欢它
    • @jjmccrystal 这样做是有原因的:你永远不应该在现有的 Python 对象/函数之后命名 Python 变量。因此,dic 是一个比 dict 更好但更奇怪的名称。
    猜你喜欢
    • 2019-06-04
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 2013-05-22
    • 2016-10-21
    • 2021-03-20
    相关资源
    最近更新 更多