如何在Python中进行字典计算?
问题
你想要对一个包含数据的字典进行各种计算(例如,最小值、最大值、排序等)。
解决方案。
我们将创建一个包含网球运动员及其大满贯冠军数量的字典。
PlayerTitles = { 'Federer': 20, 'Nadal': 20, 'Djokovic': 17, 'Murray': 3, 'Theim' : 1, 'Zverev': 0 }
1.我们有一个字典,包含球员姓名和每个球员赢得的大满贯冠军数量。现在让我们尝试找出获得冠军数量最少的球员。
#type(PlayerTitles) print(f"Output \n*** The minimum value in the dictionary is {min(PlayerTitles)} ")
输出
*** The minimum value in the dictionary is Djokovic
2. 这可能不是我们想要的结果,因为我们实际上是在尝试对字典值进行计算。所以让我们尝试使用字典的 values() 方法来解决这个问题。
print(f"Output \n*** The minimum value in the dictionary is {min(PlayerTitles.values())} ")
输出
*** The minimum value in the dictionary is 0
3. 不幸的是,这通常也不是你真正想要的。例如,你可能想知道有关相应键的信息,即获得冠军数量最少的球员的姓名。
4. 如果你为 min() 和 max() 提供一个 key 函数,你可以获得与最小值或最大值对应的键。
print(f"Output \n***{min(PlayerTitles, key=lambda k: PlayerTitles[k])} ")
输出
***Zverev
5. 但是,要获得最小值,你需要进行额外的查找。
min_titles = PlayerTitles[min(PlayerTitles, key=lambda k: PlayerTitles[k])] print(f"Output \n***{min_titles} ")
输出
***0
6. 使用 zip() 的解决方案通过将字典“反转”为 (value, key) 对的序列来解决问题。当对这样的元组进行比较时,首先比较值元素,然后比较键。
这给了我们我们想要的行为,并允许使用单个语句轻松地对字典内容进行简化和排序。
min_titles = min(zip(PlayerTitles.values(), PlayerTitles.keys())) max_titles = max(zip(PlayerTitles.values(), PlayerTitles.keys())) print(f"Output \n***{min_titles , max_titles} ")
输出
***((0, 'Zverev'), (20, 'Nadal'))
7.类似地,要对数据进行排名,请将 zip() 与 sorted() 一起使用。
titles_sorted = sorted(zip(PlayerTitles.values(), PlayerTitles.keys())) print(f"Output \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"Output \n***{min(titles_and_players)} ")
输出
***(0, 'Zverev')
9. 如果我们再次尝试调用它,我们将面临空序列异常。
10. 应该注意的是,在涉及 (value, key) 对的计算中,如果多个条目碰巧具有相同的值,则将使用键来确定结果。
例如,在 min() 和 max() 等计算中,如果存在重复值,则将返回键最小或最大的条目。这就是为什么当我们选择获得最多冠军的球员时,最终只得到一个值,即纳达尔。(参见步骤 7 输出)。
广告