如何在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的输出。