python - 使用相同的键从 dict.values() 获取最大值
问题描述
我有这个 csv.file。假设我已经使用过DictReader
,现在我有一些完整的字典列表,比如('name': 'Andrew'), ('points': 18)
等。
name points
Andrew 18
Kate 10
Jack 55
Andrew 31
Andrew 100
Jack 58
Andrew 34
Kate 22
Jack 5
Andrew 72
我想要做的是返回一个键值对,例如Andrew: (5, 100)
,其中的值是:
- 我在列表中遇到过这个名字多少次;
- 点表中此名称的最大数量。
我对第一个任务没有问题,但找不到第二个任务的解决方案。这就是我试图做的:
name_counter = defaultdict(int)
max_points = defaultdict(int)
for dictionary in list_from_csv:
name_counter[dictionary['name']] += 1 #every time I meet the name, I add +1 to the value
max_points[dictionary['name']] = ???
我在想只是 use max(dictionary[points])
,但 max 应该从数字的数量中选择,而不仅仅是一个。也许创建一个列表,但不确定如何。还有其他想法吗?
将不胜感激任何帮助。
PS 在我拥有这两个字典之后,我需要根据密钥合并它们,但我希望这不是那么难。
解决方案
您只需要弄清楚max_points[name]
每次获得新值时要做什么,对吗?
让我们假设,在每次迭代中,max_points[name]
已经正确设置为您迄今为止看到的最高值。那么,您需要如何处理新值?
很简单:如果points
大于你目前看到的最高值,那就是新的最高值;如果不是,则旧的最高值是新的最高值。
这正是这样max
做的。所以:
max_points[dictionary['name']] = max(max_points[dictionary['name']], points)
现在我们只需要验证这个假设是正确的。
由于您使用的是
defaultdict(int)
,因此它始终从 0 开始。如果您可以有负分,那已经是错误的,否则,它是正确的——到目前为止,对于任何人来说,您看到的最高分都是 0。在每一步中,如果在上一步正确,则在下一步之后也是正确的,因为这就是这样
max
做的。所以,通过归纳,最后是正确的。
作为旁注,dictionary['name']
与其一遍又一遍地重复,它可能看起来像这样更好:
for dictionary in list_from_csv:
name = dictionary['name']
name_counter[name] += 1
max_points[name] = max(max_points[name], points)
推荐阅读
- java - 枢轴索引和平衡分区(Java)
- ios - NativeScript iOS Delegate Transpilation 错误(找不到变量:__metadata)
- jquery - 如何在 jQuery 手风琴中使用更少的 jQuery
- pug - 在对象上使用 Pug 进行迭代
- javascript - 用于检查会话是否处于活动状态的 JavaScript 代码
- python - 删除匹配值后的所有列
- amazon-web-services - SSH 端口上的 AWS 负载均衡器 Git 克隆错误
- ios - 从 SFSpeechRecognizer 停止语音输入后处理文本
- java - 使用 Java(客户端证书 PFX 文件)进行相互身份验证且无法访问环境
- java - 在一项活动中显示数据取决于其他活动列表视图中的选择 - 如何