您想对数据字典执行各种计算(例如,最小值,最大值,排序等)。
我们将创建一个包含网球运动员及其大满贯冠军的字典。
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()
。
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()
解决方案通过将字典“反转”为(值,键)对的序列来解决该问题。在对此类元组执行比较时,首先比较值元素,然后再比较键。
这给了我们确切想要的行为,并允许使用单个语句轻松地对字典内容执行归约和排序。
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.Similarly,排名数据,利用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.应当注意,在涉及(值,键)对的计算中,如果多个条目碰巧具有相同的值,则将使用键来确定结果。
例如,在诸如min()
和的计算中max()
,如果碰巧有重复的值,则将返回具有最小或最大键的条目。这就是为什么我们选择标题最大的玩家时,最终只会得到一个值为Nadal的值的原因(请参见步骤7输出)。