首页 > 解决方案 > 使用相同的键从 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),其中的值是:

  1. 我在列表中遇到过这个名字多少次;
  2. 表中此名称的最大数量。

我对第一个任务没有问题,但找不到第二个任务的解决方案。这就是我试图做的:

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 在我拥有这两个字典之后,我需要根据密钥合并它们,但我希望这不是那么难。

标签: pythondictionaryiteration

解决方案


您只需要弄清楚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)

推荐阅读