Python中的defaultdict方法

文章目錄

      • 核心特點
      • 基本語法
      • 常見使用場景
        • 1. 分組數據(默認值為列表)
        • 2. 計數(默認值為整數)
        • 3. 集合操作(默認值為集合)
        • 4. 嵌套字典
      • 注意事項
      • 與普通字典對比
      • 總結
      • 1. 鍵(Key)的類型
      • 2. 值(Value)的類型
      • 3. `default_factory` 的返回值
      • 4. 嵌套 `defaultdict` 的鍵值
      • 5. 鍵和值的可變性總結
      • 常見問題解答
        • Q1:可以用 `list` 作為鍵嗎?
        • Q2:可以用 `defaultdict` 作為鍵嗎?
        • Q3:值可以是函數或類嗎?
      • 總結

在 Python 中, defaultdictcollections 模塊提供的一個非常有用的類,它是內置字典類型 dict 的子類。 defaultdict 的主要特點是 自動處理字典中不存在的鍵,避免在使用普通字典時因訪問不存在的鍵而拋出 KeyError 異常。


核心特點

  1. 自動初始化默認值:當訪問一個不存在的鍵時,defaultdict 會調用指定的默認工廠函數(default_factory)生成一個初始值,確定了字典中值的類型
  2. 簡化代碼:無需手動檢查鍵是否存在,適合需要分組、統計或聚合數據的場景。

基本語法

from collections import defaultdictd = defaultdict(default_factory)
  • default_factory:一個可調用對象(如 list, int, set, str 或自定義函數),用于生成默認值。

常見使用場景

1. 分組數據(默認值為列表)

將數據按鍵分組,類似 SQL 的 GROUP BY

from collections import defaultdictdata = [("apple", "fruit"), ("carrot", "vegetable"), ("apple", "fruit")]
grouped = defaultdict(list)for name, category in data:grouped[category].append(name)print(grouped)
# 輸出:defaultdict(<class 'list'>, {'fruit': ['apple', 'apple'], 'vegetable': ['carrot']})
2. 計數(默認值為整數)

統計元素出現次數:

from collections import defaultdicttext = "apple banana apple orange banana"
words = text.split()
count = defaultdict(int)for word in words:count[word] += 1print(count)
# 輸出:defaultdict(<class 'int'>, {'apple': 2, 'banana': 2, 'orange': 1})
3. 集合操作(默認值為集合)

避免重復值:

from collections import defaultdictpairs = [("a", 1), ("b", 2), ("a", 3)]
unique = defaultdict(set)for key, value in pairs:unique[key].add(value)print(unique)
# 輸出:defaultdict(<class 'set'>, {'a': {1, 3}, 'b': {2}})
4. 嵌套字典

構建多層嵌套結構:

from collections import defaultdictnested = defaultdict(lambda: defaultdict(int))
nested["fruit"]["apple"] += 1
nested["vegetable"]["carrot"] += 2print(nested["fruit"])        # 輸出:defaultdict(<class 'int'>, {'apple': 1})
print(nested["unknown_key"])  # 輸出:defaultdict(<class 'int'>, {})

注意事項

  1. default_factory 必須可調用:例如 listint 是類(構造函數),而 list()int() 的返回值不可作為工廠。
  2. 僅對 d[key] 有效:使用 d.get(key)key in d 不會觸發默認值生成。
  3. 性能:與普通字典性能接近,適合高頻插入操作。

與普通字典對比

# 普通字典需要手動處理缺失鍵
d = {}
key = "unknown"
if key not in d:d[key] = []
d[key].append(1)# defaultdict 自動處理
d = defaultdict(list)
d["unknown"].append(1)

總結

defaultdict 簡化了需要初始化默認值的字典操作,特別適合數據聚合、分組和統計場景。通過合理選擇 default_factory(如 listintset 或自定義函數),可以大幅提升代碼簡潔性和可讀性。

在 Python 中,defaultdict 繼承自 dict,因此它的 鍵(Key)和值(Value)的類型規則與普通字典一致,但也有一些細節需要注意。以下是詳細說明:


1. 鍵(Key)的類型

  • 規則:鍵必須是 不可變類型(Immutable)可哈希(Hashable)

  • 允許的類型

    • 基本類型:int, float, str, bool, None
    • 不可變容器:tuple(但元組內的元素也必須不可變)
    • frozenset(不可變集合)
    • 用戶自定義的不可變對象(需正確實現 __hash____eq__ 方法)。
  • 禁止的類型

    • 可變類型:list, dict, set
    • 包含可變元素的 tuple(例如 (1, [2, 3]))。
  • 示例

    from collections import defaultdict# 合法鍵
    d = defaultdict(int)
    d["apple"] = 10       # 字符串作為鍵 ?
    d[123] = 20          # 整數作為鍵 ?
    d[(1, 2)] = 30       # 不可變元組作為鍵 ?# 非法鍵(會拋出 TypeError)
    d[[1, 2]] = 40       # 列表不可哈希 ?
    d[{"a": 1}] = 50     # 字典不可哈希 ?
    

2. 值(Value)的類型

  • 規則:值可以是 任意類型,包括可變對象。

  • 允許的類型

    • 基本類型(int, float, str 等)
    • 可變容器(list, dict, set
    • 自定義對象、函數、類實例等。
  • 示例

    from collections import defaultdict# 值可以是列表(可變)
    d_list = defaultdict(list)
    d_list["fruits"].append("apple")# 值可以是字典(可變)
    d_dict = defaultdict(dict)
    d_dict["data"]["count"] = 10# 值可以是自定義對象
    class MyClass:passd_obj = defaultdict(MyClass)
    obj = d_obj["instance"]  # 自動生成一個 MyClass 實例
    

3. default_factory 的返回值

default_factory 是一個可調用對象(如 list, int 或自定義函數),它決定了 當鍵不存在時,默認值的類型。例如:

  • defaultdict(list):默認值是一個空列表([])。
  • defaultdict(int):默認值是 0
  • defaultdict(lambda: "unknown"):默認值是字符串 "unknown"

值的類型完全由 default_factory 決定,與鍵的類型無關


4. 嵌套 defaultdict 的鍵值

可以創建多層嵌套的 defaultdict,鍵的規則依然適用:

from collections import defaultdict# 嵌套 defaultdict(值類型是另一個 defaultdict)
nested = defaultdict(lambda: defaultdict(int))# 合法操作
nested["fruit"]["apple"] += 1      # 鍵為 "fruit"(字符串)和 "apple"(字符串)
nested[123][(4, 5)] = 2           # 鍵為 123(整數)和 (4, 5)(不可變元組)# 非法操作(內層鍵非法)
nested["data"][[1, 2]] = 3        # 內層鍵為列表,不可哈希 ?

5. 鍵和值的可變性總結

特性鍵(Key)值(Value)
類型限制必須不可變且可哈希可以是任意類型
可變性不可變可以可變
示例int, str, tuplelist, dict, 自定義對象

常見問題解答

Q1:可以用 list 作為鍵嗎?
  • 。列表是可變類型,不可哈希。若需用類似列表的結構作為鍵,可以轉換為不可變的 tuple
Q2:可以用 defaultdict 作為鍵嗎?
  • defaultdict 是可變對象,不可哈希。只有不可變類型(如 frozenset)可以作為鍵。
Q3:值可以是函數或類嗎?
  • 。例如:
    d = defaultdict(type)  # 默認值是類對象
    d["my_class"] = MyClass
    

總結

  • :必須為不可變且可哈希的類型(如 str, int, tuple)。
  • :可以是任意類型(包括可變對象),具體由 default_factory 決定。
  • 嵌套結構:可以自由嵌套 defaultdict,但需確保每一層的鍵合法。

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

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

相關文章

結構化數據、半結構化數據、非結構化數據 差異與實踐指南

結構化數據、半結構化數據、非結構化數據 差異與實踐指南 一、核心概念與差異對比 維度結構化數據半結構化數據非結構化數據數據結構固定Schema&#xff08;行列明確&#xff09;含標簽/層級結構&#xff08;無固定Schema&#xff09;無預定義結構存儲方式關系型數據庫&#x…

【AI News | 20250429】每日AI進展

AI Repos 1、aci ACI.dev是一個開源基礎設施層&#xff0c;旨在為AI智能體的工具使用提供支持。它通過統一的模型-上下文-協議&#xff08;MCP&#xff09;服務器或輕量級Python SDK&#xff0c;使智能體能夠以感知意圖的方式訪問600多種工具&#xff0c;并具備多租戶認證、細…

【C++ 類和數據抽象】消息處理示例(1):從設計模式到實戰應用

目錄 一、數據抽象概述 二、消息處理的核心概念 2.1 什么是消息處理&#xff1f; 2.2 消息處理的核心目標 三、基于設計模式的消息處理實現 3.1 觀察者模式&#xff08;Observer Pattern&#xff09; 3.2 命令模式&#xff08;Command Pattern&#xff09; 四、實戰場景…

【Android】自定義Trace

1&#xff0c;Trace分析 Android掉幀分析-CSDN博客 2&#xff0c;自定義Trace 以下&#xff0c;android.os.Trace公開了以下API 1&#xff0c;beginSection與endSection聯合使用&#xff0c;只能在同一個線程 2&#xff0c;beginAsyncSection與endAsyncSection可以在不同線程…

基于tabula對pdf中的excel進行識別并轉換成word(三)

上一節中是基于PaddleOCR對圖片中的excel進行識別并轉換成word優化&#xff0c;本節改變思路&#xff0c;直接從pdf中讀取表格的信息&#xff0c;具體思路如下所述。 PDF中的表格數據如下截圖所示&#xff1a; 一、基于tabula從PDF中提取表格 df_list tabula.read_pdf("…

Java中的接口和抽象類

Java 抽象類與接口&#xff1a;區別、應用與選擇 在 Java 編程的世界里&#xff0c;抽象類和接口是兩個極為重要的概念&#xff0c;它們在實現代碼抽象、提高代碼復用性和可維護性方面發揮著關鍵作用。然而&#xff0c;很多開發者在使用時容易混淆這兩個概念。本文將深入探討 …

Java讀Excel:解析阿里云easyExcel導入文件的行號

文章目錄 引言I 解析阿里云easyExcel導入文件的行號聲明解析對象的基類判斷Excel解析對象類型是否包含繼承某個類 isAssignableFromJava 轉換list類型并設置下標到元素對象屬性II 封裝excel 文件讀取excel 文件讀取用法文件導入上下文III 參數校驗工具類校驗參數是否合法 (jaka…

mmap核心原理和用途及其與內存映射段的關系

mmap 是 Linux/Unix 系統中的一個關鍵系統調用&#xff0c;全稱是 Memory Map&#xff08;內存映射&#xff09;。它的核心功能是將 文件、設備或匿名內存 直接映射到進程的虛擬地址空間&#xff0c;從而實現高效的內存訪問和操作。以下是其核心原理和用途的詳細說明&#xff1…

數據庫概論速成期中版

文章目錄 引論數據庫用戶Casual usersNaive usersApplication programmersDatabase administrators 關系模型CAP數據庫兩種描述關系數據庫的方式簡單總結 第一范式規則第二范式規則舉個例子符合第二規則的操作不符合第二規則的操作 第三范式規則key,superkey,null values,主鍵&…

解決調用Claude 3.7接口 403 Request not allowed問題

1. 遇到問題 Python 基于 Langchain 對接 Claude 3.7 大模型接口進行問答時&#xff0c;由于國內不在Claude支持的國家和地區&#xff0c;所以一直調不通&#xff0c;錯誤 anthropic.PermissionDeniedError: Error code: 403 - {error: {type: forbidden, message: Request…

Vue2+Vue3學習筆記

Vue基礎介紹 下載并安裝vue.js v2 https://v2.cn.vuejs.org/https://v2.cn.vuejs.org/ v3 https://v3.cn.vuejs.org/ 會重定向到Vue.js - 漸進式 JavaScript 框架 | Vue.jsVue.js - 漸進式的 JavaScript 框架https://cn.vuejs.org/ 從v2過渡到v3 在F盤創建v2v3學習筆記 并…

2025年KBS新算法 SCI1區TOP:長穎燕麥優化算法AOO,深度解析+性能實測

目錄 1.摘要2.算法原理3.結果展示4.參考文獻5.文章&代碼獲取 1.摘要 本文提出了一種新穎的元啟發式算法——長穎燕麥優化算法&#xff08;AOO&#xff09;&#xff0c;該算法靈感來自動畫燕麥在環境中的自然行為。AOO模擬了長穎燕麥的三種獨特行為&#xff1a;(i) 通過自然…

CentosLinux系統crontab發現執行刪除命令失效解決方法

權限或安全策略限制 ??可能場景??&#xff1a; ??### ??目錄權限沖突??&#xff1a; 你的目錄權限為 drwxr-xr-x&#xff08;屬主 mssql&#xff09;&#xff0c;但 cron 任務以 root 執行。 ??風險點??&#xff1a;若目錄內文件屬主為 mssql 且權限為 700&…

后驗概率最大化(MAP)估計算法原理以及相具體的應用實例附C++代碼示例

1. MAP估計基本原理 MAP&#xff08;Maximum A Posteriori&#xff0c;最大后驗概率估計&#xff09;是貝葉斯推斷中的重要概念&#xff0c;它的目標是&#xff1a; 給定觀測數據&#xff0c;找到使得后驗概率最大的參數值。 公式化表示&#xff1a; [ θ MAP arg ? max ?…

16、路由守衛:設置魔法結界——React 19 React Router

一、魔法結界的本質 "路由守衛是霍格沃茨城堡的隱身斗篷&#xff0c;在時空裂隙中精準控制維度躍遷&#xff01;" 魔法部交通司官員揮舞魔杖&#xff0c;React Router 的嵌套路由在空中交織成星軌矩陣。 ——基于《國際魔法聯合會》第7號時空協議&#xff0c;路由守…

從車道檢測項目入門open cv

從車道檢測項目入門open cv 前提聲明&#xff1a;非常感謝b站up主 嘉然今天吃帶變&#xff0c;感謝其視頻的幫助。同時希望各位大佬積積極提出寶貴的意見。&#x1f60a;&#x1f60a;&#x1f60a;(???)(●’?’●)╰(▽)╯ github地址&#xff1a;https://github.com/liz…

【行業特化篇3】制造業簡歷優化指南:技術參數與標準化流程的關鍵詞植入藝術

寫在最前 作為一個中古程序猿,我有很多自己想做的事情,比如埋頭苦干手搓一個低代碼數據庫設計平臺(目前只針對寫java的朋友),比如很喜歡幫身邊的朋友看看簡歷,講講面試技巧,畢竟工作這么多年,也做到過高管,有很多面人經歷,意見還算有用,大家基本都能拿到想要的offe…

如何在本地部署小智服務器:從源碼到全模塊運行的詳細步驟

小智聊天機器人本地后臺服務器源碼全模塊部署 作者&#xff1a;林甲酸 -不是小女子也不是女漢子 是大女子 更新日期&#xff1a;2025年4月29日 &#x1f3af; 前言&#xff1a;為什么要寫這篇教程&#xff1f; 上周按照蝦哥小智服務器的教程去部署本地后臺&#xff0c;我用的是…

github開源項目添加開源協議,使用很簡單

直接在 GitHub 網頁上創建 進入你的 GitHub 倉庫 打開你的項目倉庫頁面&#xff08;如 https://github.com/用戶名/倉庫名&#xff09;。 點擊 "Add file" → "Create new file" 在倉庫主頁&#xff0c;點擊右上角的 "Add file" 按鈕&#xff…

8.idea創建maven項目(使用Log4j日志記錄框架+Log4j 介紹)

8.idea創建maven項目(使用Log4j日志記錄框架Log4j 介紹) 在 IntelliJ IDEA 的 Maven 項目中引入了 Log4j&#xff0c;并配置了日志同時輸出到控制臺和文件。 Log4j 提供了靈活的日志配置選項&#xff0c;可以根據項目需求調整日志級別、輸出目標和格式。 1. 創建 Maven 項目 …