- Python進(jìn)階編程:編寫更高效、優(yōu)雅的Python代碼
- 劉宇宙 謝東 劉艷
- 785字
- 2021-04-30 12:39:44
3.2.4 字典運(yùn)算
字典是key-value形式的對(duì)象,要對(duì)字典中的value求最小值、最大值、排序等,該如何操作呢?
以下是課程與得分字典示例,相關(guān)代碼(dict_calculation.py)如下:
course_score = { '高等代數(shù)': 100.0, '算法與數(shù)據(jù)結(jié)構(gòu)': 92.0, '編譯原理': 88.5, '數(shù)學(xué)分析': 97.5, '統(tǒng)計(jì)學(xué)原理': 90.5 }
為了對(duì)字典值執(zhí)行計(jì)算操作,通常需要使用zip()函數(shù)先將鍵和值反轉(zhuǎn)過來。以下是查找最高和最低得分和課程名稱的代碼(dict_calculation.py):
min_score = min(zip(course_score.values(), course_score.keys())) print(f'最低得分課程及得分:{min_score[1]} {min_score[0]}') max_score = max(zip(course_score.values(), course_score.keys())) print(f'最高得分課程及得分:{max_score[1]} {max_score[0]}')
執(zhí)行py文件,可以看到輸出結(jié)果如下:
最低得分課程及得分:編譯原理 88.5 最高得分課程及得分:高等代數(shù) 100.0
類似地,我們可以使用zip()和sorted()函數(shù)來排列字典數(shù)據(jù),即在py文件中添加如下代碼(dict_calculation.py):
score_sorted = sorted(zip(course_score.values(), course_score.keys())) print(score_sorted)
需要注意的是,zip()函數(shù)創(chuàng)建的是一個(gè)只能訪問一次的迭代器。若寫成如下形式,代碼就會(huì)產(chǎn)生錯(cuò)誤:
score_and_course = zip(course_score.values(), course_score.keys()) # ok,print is normal print(min(score_and_course)) # ValueError: max() arg is an empty sequence print(max(score_and_course))
在一個(gè)字典上執(zhí)行普通的數(shù)學(xué)運(yùn)算,它們會(huì)僅作用于鍵,而不是值,示例如下:
print(min(course_score)) # 數(shù)學(xué)分析 print(max(course_score)) # 高等代數(shù)
這個(gè)結(jié)果并不是我們所期望的,因?yàn)槠谕氖窃谧值浼仙蠄?zhí)行這些計(jì)算。或許我們可以嘗試使用字典的values()方法來解決這個(gè)問題,示例如下:
print(min(course_score.values())) # 88.5 print(max(course_score.values())) # 100.0
不幸的是,這個(gè)結(jié)果同樣也不是我們所期望的,因?yàn)槲覀冞€要知道對(duì)應(yīng)的鍵的信息(比如哪門課程的分?jǐn)?shù)是最低的)。
可以在min()和max()函數(shù)中提供key參數(shù)來獲取最小值或最大值對(duì)應(yīng)的鍵的信息,示例如下:
print(min(course_score, key=lambda k: course_score[k])) # 編譯原理 print(max(course_score, key=lambda k: course_score[k])) # 高等代數(shù)
但若還想要得到最小值,得再執(zhí)行一次查找操作,示例如下:
min_score = course_score[min(course_score, key=lambda k: course_score[k])] print(min_score)
前面的zip()函數(shù)通過將字典反轉(zhuǎn)為(值,鍵)元組序列,可以很方便地解決上述問題。
當(dāng)比較兩個(gè)元組的時(shí)候,首先比較值,然后比較鍵。這樣能通過一條簡單的語句很輕松地在字典中實(shí)現(xiàn)求最值和排序操作。
注意 在計(jì)算操作中使用了(值,鍵)對(duì),當(dāng)多個(gè)實(shí)體擁有相同的值的時(shí)候,鍵會(huì)決定返回結(jié)果。如在執(zhí)行min()和max()運(yùn)算的時(shí)候,如果恰巧最小或最大值有重復(fù),那么返回?fù)碛凶钚』蜃畲箧I的實(shí)體。
- Java程序設(shè)計(jì)與開發(fā)
- Testing with JUnit
- 自己動(dòng)手實(shí)現(xiàn)Lua:虛擬機(jī)、編譯器和標(biāo)準(zhǔn)庫
- Practical DevOps
- Kotlin Standard Library Cookbook
- Magento 1.8 Development Cookbook
- 實(shí)戰(zhàn)Java高并發(fā)程序設(shè)計(jì)(第3版)
- C#程序設(shè)計(jì)
- Android開發(fā):從0到1 (清華開發(fā)者書庫)
- SQL基礎(chǔ)教程(第2版)
- Zabbix Performance Tuning
- 微課學(xué)人工智能Python編程
- Java并發(fā)編程之美
- 現(xiàn)代CPU性能分析與優(yōu)化
- 計(jì)算機(jī)程序的構(gòu)造和解釋(JavaScript版)