【问题标题】:Finding highest value in a dictionary在字典中查找最高值
【发布时间】:2019-05-05 09:23:35
【问题描述】:

我是编程新手,目前正在学习 CSC 110 课程。我们的任务是创建一堆函数,用给定的一些数据来做各种各样的事情。我已将所有这些数据放入字典中,但在从中获取我想要的数据时遇到了一些麻烦。

这是我的问题:

我有一本字典,其中存储了一堆国家,然后是一个包含其人口和 GDP 的列表。像这样格式化

{'country': [population, GDP], ...}

我的任务是循环遍历并找到人口或 GDP 最高的国家,然后打印:

'The country with the highest population is ' + highCountry+\
    ' with a population of ' + format(highPop, ',.0f')+'.')

为了做到这一点,我编写了这个函数(这个函数专门针对最高人口,但它们看起来都差不多)。

def highestPop(worldInfo):
        highPop = worldInfo[next(iter(worldInfo))][0] #Grabs first countries Population
        highCountry = next(iter(worldInfo))#Grabs first country in worldInfo

        for k,v in worldInfo.items():
                if v[0] > highPop:
                    highPop = v[0]
                    highCountry = k

        return highPop,highCountry

虽然这对我有用,但我认为有一种更简单的方法可以做到这一点。我也不是 100% 确定 [next(iter(worldInfo))] 是如何工作的。这只是获取它看到的第一个值吗?

提前感谢您的帮助!

编辑:对不起,我想我不清楚。我需要传递国家人口以及国家名称。所以我可以在我的主要功能中打印它们。

【问题讨论】:

  • 有一个函数max()可以接受一些可迭代的东西(比如dict项目)。如果您将key 函数作为提取所需值的参数(这里:人口),它将返回您想要的项目。

标签: python dictionary computer-science


【解决方案1】:

我想你正在寻找这个:

max(worldInfo.items(), key=lambda x: x[1][0])

这将返回国家名称及其信息。例如:

('france', [100, 22])

max() 函数可以在 python "iterables" 上工作,这是一个花哨的词,表示任何可以循环或循环的东西。因此,它会循环或循环遍历您放入其中的内容并吐出最高的项目。

但是它如何判断哪个元组最高呢?哪个更高:法国还是德国?您必须指定一个键(有关如何判断每个项目的一些规范)。 key=lambda 等指定了一个给定项目(x)的函数,根据x[1][0]判断该项目。在这种情况下,如果项目为('france', [100, 22]),则x[1][0] 为100。因此比较每个项目的x[1][0],并返回最高的项目。

next() 和 iter() 函数用于 python 迭代器。例如:

mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)

print(next(myit)) #=> apple
print(next(myit)) #=> banana
print(next(myit)) #=> cherry

【讨论】:

  • 是的,这正是我想要的。现在我只需要花 30 分钟弄清楚这意味着什么。
  • @Conner 你的评论如果编辑成你的答案会更有用,只是说'。
  • 是否只是因为我老了,古怪并且学会了用 BASIC 和 FORTRAN IV 编程,我认为使用 Python 的 max() 函数——哎呀,除了数组和比较运算符之外,什么都用—— - 是作弊的最高级别
  • @RonJohn 我老了,脾气暴躁,但我也懒得重写已经存在的东西。
  • @JollyJoker 您是学生(“刚接触编程,目前正在学习 CSC 110 课程”),因此需要为你自己——至少一次——你自己的 min()、max()、冒泡排序、快速排序、链表、二叉树、散列等实现。
【解决方案2】:

使用max() 函数,如下所示:

max(item[0] for item in county_dict.values()) #use item[1] for GDP!

还可以尝试将值不存储在列表 ([a, b]) 中,而是存储在元组 ((a, b)) 中。

编辑:就像 iamanigeeit 在 cmets 中所说,这也可以为您提供国家名称:

max(data[0], country for country, data in country_dict.items())

【讨论】:

  • 所以我不仅要传回国家人口,还要传回国家名称。有没有办法从上面给出的信息中获取这些信息?
  • @LukeKelly 好吧,如果值始终不同,您可以从 max() 返回的值中获取名称。循环也可以,但我不推荐它。
  • max(data[0], country for country, data in country_dict.items())
  • @iamanigeeit 这行得通,很好!我只是将第一部分的值交换为:country, data[0] 除此之外,太棒了!
  • 但是元组是从第一个元素开始比较的......这就是为什么我把data[0]放在第一位
【解决方案3】:

获取具有最高值的密钥的有效解决方案:您可以这样使用max函数:

highCountry = max(worldInfo, key=lambda k: worldInfo[k][0])

关键参数是一个函数,它指定要使用什么值来确定 max.max(data[0], country for country, data in country_dict.items())

显然:

highPop = worldInfo[highCountry][0]

【讨论】:

  • 更正 - 我使用了生成器压缩,它生成值 lazily,因此它并不慢(或效率较低)。但是,使用max()key 进行排序是个好主意!
  • 我正在使用提供的两个 cmets 来解决这个问题。 highCountry = max(worldInfo, key=lambda k: worldInfo[k][0]) highPop = max(item[0] for item in worldInfo.values()) #use item[1] for GDP! 我有什么理由不应该这样做吗?
  • 确实是@EthanK,但是您无法有效地获取密钥。 :)
  • @LukeKelly 有了key就可以直接访问对应的value,效率更高。请参阅我编辑的答案。
  • 除非是 Python 2,否则我们需要 .itervalues().iteritems()
猜你喜欢
  • 1970-01-01
  • 2016-08-09
  • 2021-02-20
  • 1970-01-01
  • 2020-07-26
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
相关资源
最近更新 更多