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

更新于:2020年11月9日

2K+ 次浏览

启动您的 职业生涯

完成课程后获得认证

开始
广告