官术网_书友最值得收藏!

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í)體。

主站蜘蛛池模板: 横峰县| 高唐县| 永丰县| 保山市| 高邮市| 武乡县| 苍溪县| 延吉市| 荔浦县| 当阳市| 临高县| 西乡县| 静宁县| 从江县| 监利县| 崇义县| 清苑县| 宜宾市| 库尔勒市| 安康市| 新干县| 巧家县| 彝良县| 绥芬河市| 海丰县| 牙克石市| 内江市| 阿瓦提县| 黄梅县| 永宁县| 黑水县| 威远县| 卫辉市| 海淀区| 武川县| 静安区| 容城县| 广南县| 田林县| 灵寿县| 澄江县|