Python 字典和集合(常見的映射方法)

本章內容的大綱如下:
常見的字典方法
如何處理查找不到的鍵
標準庫中 dict 類型的變種set 和 frozenset 類型
散列表的工作原理
散列表帶來的潛在影響(什么樣的數據類型可作為鍵、不可預知的
順序,等等)

常見的映射方法

映射類型的方法其實很豐富。表 3-1 為我們展示了
dict、defaultdict 和 OrderedDict 的常見方法,后面兩個數據類型
是 dict 的變種,位于 collections 模塊內。

表3-1:dict、collections.defaultdict和
collections.OrderedDict這三種映射類型的方法列表(依然省略
了繼承自object的常見方法);可選參數以[…]表示

image

  • default_factory 并不是一個方法,而是一個可調用對象(callable),它的值在
    defaultdict 初始化的時候由用戶設定。

#OrderedDict.popitem() 會移除字典里最先插入的元素(先進先出);同時這個方法還有一
個可選的 last 參數,若為真,則會移除最后插入的元素(后進先出)。

上面的表格中,update 方法處理參數 m 的方式,是典型的“鴨子類
型”。函數首先檢查 m 是否有 keys 方法,如果有,那么 update 函數就
把它當作映射對象來處理。否則,函數會退一步,轉而把 m 當作包含了
鍵值對 (key, value) 元素的迭代器。Python 里大多數映射類型的構造
方法都采用了類似的邏輯,因此你既可以用一個映射對象來新建一個映
射對象,也可以用包含 (key, value) 元素的可迭代對象來初始化一個
映射對象。

在映射對象的方法里,setdefault 可能是比較微妙的一個。我們雖然
并不會每次都用它,但是一旦它發揮作用,就可以節省不少次鍵查詢,
從而讓程序更高效。如果你對它還不熟悉,下面我會通過一個實例來講
解它的用法。

用setdefault處理找不到的鍵
當字典 d[k] 不能找到正確的鍵的時候,Python 會拋出異常,這個行為
符合 Python 所信奉的“快速失敗”哲學。也許每個 Python 程序員都知道
可以用 d.get(k, default) 來代替 d[k],給找不到的鍵一個默認的
返回值(這比處理 KeyError 要方便不少)。但是要更新某個鍵對應的值的時候,不管使用 getitem 還是 get 都會不自然,而且效率
低。就像示例 3-2 中的還沒有經過優化的代碼所顯示的那
樣,dict.get 并不是處理找不到的鍵的最好方法。

示例 3-2 是由 Alex Martelli 舉的一個例子 變化而來,例子生成的索引
跟示例 3-3 顯示的一樣。

示例 3-2 index0.py 這段程序從索引中獲取單詞出現的頻率信
息,并把它們寫進對應的列表里(更好的解決方案在示例 3-4 中)

"""創建一個從單詞到其出現情況的映射"""
import sys
import re
WORD_RE = re.compile(r'\w+')
index = {}
with open(sys.argv[1], encoding='utf-8') as fp:for line_no, line in enumerate(fp, 1):for match in WORD_RE.finditer(line):word = match.group()column_no = match.start()+1location = (line_no, column_no)
# 這其實是一種很不好的實現,這樣寫只是為了證明論點
occurrences = index.get(word, []) ?
occurrences.append(location) ?
index[word] = occurrences ?
# 以字母順序打印出結果
for word in sorted(index, key=str.upper): ?print(word, index[word])

? 提取 word 出現的情況,如果還沒有它的記錄,返回 []。
? 把單詞新出現的位置添加到列表的后面。
? 把新的列表放回字典中,這又牽扯到一次查詢操作。
? sorted 函數的 key= 參數沒有調用 str.uppper,而是把這個方法
的引用傳遞給 sorted 函數,這樣在排序的時候,單詞會被規范成統一
格式。

示例 3-3 這里是示例3-2 的不完全輸出,每一行的列表都代表一
個單詞的出現情況,列表中的元素是一對值,第一個值表示出現的
行,第二個表示出現的列

$ python3 index0.py ../../data/zen.txt
a [(19, 48), (20, 53)]
Although [(11, 1), (16, 1), (18, 1)]
ambiguity [(14, 16)]
and [(15, 23)]
are [(21, 12)]
aren [(10, 15)]
at [(16, 38)]
bad [(19, 50)]
be [(15, 14), (16, 27), (20, 50)]
beats [(11, 23)]
Beautiful [(3, 1)]
better [(3, 14), (4, 13), (5, 11), (6, 12), (7, 9), (8, 11),
(17, 8), (18, 25)]
...

示例 3-2 里處理單詞出現情況的三行,通過 dict.setdefault 可以只
用一行解決。示例 3-4 更接近 Alex Martelli 自己舉的例子。

示例 3-4 index.py 用一行就解決了獲取和更新單詞的出現情況列
表,當然跟示例 3-2 不一樣的是,這里用到了 dict.setdefault

"""創建從一個單詞到其出現情況的映射"""
import sys
import re
WORD_RE = re.compile(r'\w+')
index = {}
with open(sys.argv[1], encoding='utf-8') as fp:for line_no, line in enumerate(fp, 1):for match in WORD_RE.finditer(line):word = match.group()
column_no = match.start()+1location = (line_no, column_no)index.setdefault(word, []).append(location) ?
# 以字母順序打印出結果
for word in sorted(index, key=str.upper):print(word, index[word])

? 獲取單詞的出現情況列表,如果單詞不存在,把單詞和一個空列表
放進映射,然后返回這個空列表,這樣就能在不進行第二次查找的情況
下更新列表了。

也就是說,這樣寫:

my_dict.setdefault(key, []).append(new_value)

跟這樣寫:

if key not in my_dict:
my_dict[key] = []
my_dict[key].append(new_value)

二者的效果是一樣的,只不過后者至少要進行兩次鍵查詢——如果鍵不
存在的話,就是三次,用 setdefault 只需要一次就可以完成整個操
作。

那么,在單純地查找取值(而不是通過查找來插入新值)的時候,該怎
么處理找不到的鍵呢?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77155.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77155.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77155.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

對抗Prompt工程:構建AI安全護欄的攻防實踐

大語言模型的開放性與自然語言交互特性使其面臨前所未有的Prompt工程攻擊威脅。本文通過分析2021-2023年間157個真實越獄案例,揭示語義混淆、上下文劫持、多模態組合三重攻擊路徑的技術原理,提出融合動態意圖拓撲分析(DITA)、對抗…

STL c++ list——模擬實現

結點類的模擬實現 list是一個帶頭雙向循環鏈表 因需要實現一個節點類&#xff0c;其中包含哨兵位&#xff08;用來標識位置&#xff09;&#xff0c;節點信息&#xff08;val數據&#xff0c;prev后指針&#xff0c;next后指針&#xff09; template<class T> struct …

ORM、Mybatis和Hibernate、Mybatis使用教程、parameterType、resultType、級聯查詢案例、resultMap映射

DAY21.1 Java核心基礎 ORM Object Relationship Mapping 對象關系映射 面向對象的程序到—關系型數據庫的映射 比如java – MySQL的映射 ORM框架就是實現這個映射的框架 Hibernate、Mybatis、MybatisPlus、Spring Data JPA、Spring JDBC Spring Data JPA的底層就是Hiber…

【學習自用】配置文件中的配置項

server.port服務器端口&#xff0c;常被用于指定應用程序運行時所監聽的端口號spring.datasource.url用于配置數據源的數據庫連接URLspring.datasource.username用于指定連接數據庫的用戶名spring.datasource.password用于配置數據源時設置數據庫連接密碼的屬性mybatis.mapper-…

使用protobuf編譯提示無法打開包括文件: ‘absl/log/absl_log.h’: No such file or directory

問題原因 Protobuf 依賴 Abseil&#xff1a; Protobuf 3.20 版本開始依賴 Abseil&#xff0c;但你的系統未正確安裝或配置 Abseil。 頭文件路徑未包含&#xff1a; 編譯器找不到 absl/log/absl_log.h&#xff0c;可能是因為 Abseil 未正確安裝或未在項目中設置包含路徑。 …

Spring AI Alibaba 文檔檢索使用

一、文檔檢索 (Document Retriever)簡介 1、核心概念 文檔檢索&#xff08;DocumentRetriever&#xff09;是一種信息檢索技術&#xff0c;旨在從大量未結構化或半結構化文檔中快速找到與特定查詢相關的文檔或信息。文檔檢索通常以在線(online)方式運行。 DocumentRetriever通…

前端面試核心知識點整理:從 JavaScript 到 Vue 全解析

一、JavaScript 異步編程核心:Promise 與 async/await 1. Promise 深度解析 定義:Promise 是處理異步操作的對象,代表一個異步操作的最終狀態(成功 / 失敗)。三種狀態: pending(進行中):初始狀態,異步操作未完成。fulfilled(已成功):異步操作成功,調用 resolve …

音視頻(四)android編譯

前言 前面已經講了在windows上應用了&#xff0c;這章主要講述android上編譯 1&#xff1a;環境 git 如果失敗 直接跑到相應網站 手動下載 ubuntu22.* android ndk r21e download:https://developer.android.google.cn/ndk/downloads/index.html?hluk 為什么用這個&#xff0…

【kind管理腳本-3】腳本函數說明文檔 —— 便捷使用 kind 創建、刪除、管理集群腳本

下面是一份詳細的說明文檔&#xff0c;介紹該腳本的功能、用法及各部分的含義&#xff0c;供您參考和使用&#xff1a; Kind 集群管理腳本說明文檔 此腳本主要用于管理 Kind&#xff08;Kubernetes IN Docker&#xff09;集群&#xff0c;提供創建、刪除、導出 kubeconfig、加…

【計算機行業發展與重塑】

計算機行業正經歷前所未有的變革&#xff0c;AI技術的爆發式發展與產業升級的深度融合&#xff0c;正在重塑行業格局與就業市場。以下從行業趨勢、AI的核心價值、就業需求三個維度展開分析。 一、行業趨勢&#xff1a;AI驅動下的多極增長 AI成為核心引擎 生成式AI的突破&#…

(高頻SQL50題)1667. 修復表中的名字

問題 表&#xff1a; Users ------------------------- | Column Name | Type | ------------------------- | user_id | int | | name | varchar | ------------------------- user_id 是該表的主鍵(具有唯一值的列)。 該表包含用戶的 ID 和名字…

基于人工智能的醫學影像關聯分析:利用潛在空間幾何混雜因素校正法|文獻速遞-深度學習醫療AI最新文獻

Title 題目 AI-based association analysis for medical imaging using latent-spacegeometric confounder correction 基于人工智能的醫學影像關聯分析&#xff1a;利用潛在空間幾何混雜因素校正法 01 文獻速遞介紹 人工智能&#xff08;AI&#xff09;已成為各個領域的…

開源免費虛擬化軟件PVE功能介紹

Proxmox VE&#xff08;PVE&#xff09;提供了一個基于 Web UI&#xff08;管理界面&#xff09;的虛擬化管理平臺&#xff0c;用戶可以通過瀏覽器管理 虛擬機&#xff08;VM&#xff09;、容器&#xff08;LXC&#xff09;、存儲、網絡、備份、用戶權限等。 一、PVE Web 界面…

新球體育比分狀態監控

文章目錄 目標分析監控邏輯代碼目標分析 網頁監控地址:aHR0cHM6Ly9saXZlLnRpdGFuMDA3LmNvbS9pbmRleDJpbjEuYXNweD9pZD0x 監控邏輯 比分等數據主要是依賴JS加載得到,通過ajax后端進行渲染 代碼 # -*- coding: utf-8 -*-import warnings warnings.filterwarnings(ignore) f…

【lodash的omit函數詳解 - 從入門到精通】

lodash的omit函數詳解 - 從入門到精通 小白視角&#xff1a;什么是omit&#xff1f; omit在英文中意為"忽略"或"省略"。在編程中&#xff0c;它就是從一個對象中刪除不需要的屬性&#xff0c;返回一個新對象。 // 原始對象 const person {name: "…

軟考筆記9——數據庫技術基礎

第九章節——數據庫技術基礎 數據庫技術基礎 第九章節——數據庫技術基礎一、基本概念1. 數據庫與數據庫系統2. 數據庫的三級模式2.1 內模式2.2 概念模式2.3 外模式2.4 數據庫的兩級映射2.5 數據庫設計的基本步驟 二、數據模型1. 基本概念2. E-R模型2.1 實體2.2 聯系2.3 屬性 3…

Django分頁教程及示例

推薦超級課程: 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰目錄 完整代碼示例:結論Django的分頁模塊允許你將大量數據分割成更小的塊(頁面)。這對于以可管理的方式顯示項目列表,如博客文章或產品…

int 與 Integer 的區別詳解

1. 本質區別 特性intInteger類型基本數據類型&#xff08;Primitive&#xff09;包裝類&#xff08;Wrapper Class&#xff09;存儲位置棧&#xff08;或作為對象成員在堆中&#xff09;堆&#xff08;對象實例&#xff09;默認值0null&#xff08;可能導致 NullPointerExcept…

mariadb使用docker compose方式安裝

問題 本地mac m1上面的mysql和mariadb突然不用使用了&#xff0c;重新安裝也不想&#xff0c;最近mac系統也更新了&#xff0c;brew也更新了&#xff0c;重新安裝mariadb還是不能正常使用&#xff0c;現在我打算使用docker來安裝本地的mariadb了。 默認配置文件my.cnf 從容器…

基于React + Antd + Java的OFD文件上傳預覽實現方案(OFD文件轉圖片)

一、前端實現方案(React + Antd) import React, {useState } from react; import {Upload, Button, Image, Carousel } from antd; import {UploadOutlined } from @ant-design/icons;const OFDUploadPreview = () => {const [previewImages, setPreviewImages] = useSta…