如何在Python中使用字典进行计算?

如何在Python中使用字典进行计算?

阅读更多:Python 教程

问题

您希望对数据字典执行各种计算(例如获取最小值、最大值、排序等)。

解决方案

我们将创建一个包含网球选手及其大满贯冠军数的字典。

PlayerTitles = {
   'Federer': 20,
   'Nadal': 20,
   'Djokovic': 17,
   'Murray': 3,
   'Theim' : 1,
   'Zverev': 0
}

1. 我们有一个带有球员姓名和每个球员赢得的大满贯冠军数的字典。现在让我们尝试找出获得冠军最少的球员。

#type(PlayerTitles)
print(f"输出\n*** 字典中的最小值为 {min(PlayerTitles)} ")

输出

*** 字典中的最小值为 Djokovic

2. 这可能不是我们想要的,因为我们实际上正在尝试执行包含字典值的计算。因此,让我们尝试使用字典的values()方法来解决这个问题。

print(f"输出\n*** 字典中的最小值为 {min(PlayerTitles.values())} ")

输出

*** 字典中的最小值为 0

3. 不幸的是,这通常也不是您想要的。例如,您可能想了解与相应键相关的信息,即获得冠军次数最少的球员名字。

4. 如果将min()和max()命令中的键函数(lambda k: PlayerTitles[k])添加到min()和max()命令中,您将获得与最小值或最大值对应的键。

print(f"输出\n***{min(PlayerTitles, key=lambda k: PlayerTitles[k])} ")

输出

***Zverev

5. 但是,要获取最小值,您需要执行额外的查找。

min_titles = PlayerTitles[min(PlayerTitles, key=lambda k: PlayerTitles[k])]
print(f"输出\n***{min_titles} ")

输出

***0

6.针对zip()的解决方案通过“反转”字典为(值,键)对的序列来解决该问题。在对这样的元组执行比较时,先比较值元素,然后是键。

这给了我们所需要的行为,并且允许使用一个语句来轻松地进行字典内容的归约和排序。

min_titles = min(zip(PlayerTitles.values(), PlayerTitles.keys()))
max_titles = max(zip(PlayerTitles.values(), PlayerTitles.keys()))

print(f"输出\n***{min_titles , max_titles} ")

输出

***((0, 'Zverev'), (20, 'Nadal'))

7.类似地,要对数据进行排序,请使用带有sorted()命令的zip()函数。

titles_sorted = sorted(zip(PlayerTitles.values(), PlayerTitles.keys()))
print(f"输出\n***{titles_sorted} ")

输出

***[(0, 'Zverev'), (1, 'Theim'), (3, 'Murray'), (17, 'Djokovic'), (20, 'Federer'), (20, 'Nadal')]

8. 在执行这些计算时,请注意zip()创建的迭代器只能被消耗一次。

titles_and_players = zip(PlayerTitles.values(), PlayerTitles.keys())
print(f"输出\n***{min(titles_and_players)} ")

输出

*** (0, 'Zverev')

9. 如果尝试再次调用它,则会遇到空序列异常。

10. 值得注意的是,在涉及(值,键)对的计算中,如果多个条目恰好具有相同的值,则将使用键来确定结果。

例如,在像min()和max()这样的计算中,如果存在重复值,则将返回具有最小或最大键的条目。这就是为什么我们选择获得最多冠军的球员时最终只得到一个值(即Nadal),请参见步骤7的输出。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程