Python Cookbook-4.13 獲取字典的一個子集

任務

你有一個巨大的字典,字典中的一些鍵屬于一個特定的集合,而你想創建一個包含這個鍵集合及其對應值的新字典。

解決方案

如果你不想改動原字典:

def sub_dict(somedict,somekeys,default = None):return dict([(k, somedict.get(k,default)) for k in somekeys ])

如果你從原字典中刪除那些符合條件的條目:

def sub_dict_remove(somedict,somekeys,default = None):return dict([ (k, somedict.pop(k,default)) for k in somekeys ])

下面是兩個函數的使用和效果:

>>>d = {'a':5,'b':6,'c':7}
>>>print sub_dict(d,'ab'),d
{'a':5,'b':6}{'a':5,'b':6,'c': 7}
>>> print sub_dict_remove(d,'ab'),d
{'a':5,'b':6}{'c':7}

討論

在 Python 中,我在很多地方都用到了字典——數據庫的行、主鍵和復合鍵,用于模板解析的變量名字空間等。我常常需要基于另外一個已有的大字典創建一個新字典,此字典的鍵是大字典的鍵的一個子集。在大多數情況下,原字典應該保持不變;但有時,我也需要在完成了抽取之后刪除在原字典中的子集。本節的解決方案對兩種可能性都給出了答案。區別僅僅在于,如果需要原字典保持原樣不變,使用get方法,如果需要刪除子集,則使用 pop 方法。

如果 somekeys 中的某元素k并不是 somedict的鍵,解決方案提供的函數會將k作為結果的鍵,并對應一個默認值(可以作為一個可選的參數傳遞給這兩個函數,默認情況下是 None)。所以,最終結果也不一定是somedict 的子集。不過我卻發現這種行為方式對我的應用非常有幫助。

當你認為 somekeys中的所有的元素都應當是 somedict 的鍵時,也許會希望在鍵“缺失的時候獲得一個異常,它可以提示和警告你程序中的bug。記住,Tim Peters 在 The Zeno/Python 中說過“錯誤不應該被靜靜地略過,除非有意為之”(在 Python 的交互式解釋器的提示符下敲入 import this 并回車,你將看到精煉的 Python 設計原則)。所以,如果從你的應用的角度看,鍵不匹配是一個錯誤,那么會希望馬上得到一個異常來提醒你錯誤的發生。如果這的確是你所希望的,可以對解決方案中的函數略作修改:

def sub_dict_strict(somedict,somekeys):return dict([ (k,somedict[k]) for k in somekeys ])
def sub_dict_remove_strict(somedict,somekeys):return dict([ (k,somedict.pop(k)) for k in somekeys ])

這些更加嚴格的變體版本甚至比原版本更簡單——這充分說明了Python 本來就喜歡在意外發生時拋出異常。
或者,你希望在鍵不匹配時直接將其忽略。這也只需要一點點修改:

def sub_dict_select(somedict,somekeys):return dict([ (k,somedict[k[) for k in somekeys if k in somedict])
def sub_dict_remove_select(somedict,somekeys):return dict([ (k,somedict,pop(k)) for k in somekeys if k in somedict))

列表推導中的if子句做完了我們期望的事,即在應用k之前先做鑒別工作。

在 Python 2.4中可以用生成器表達式來替代列表推導,用它作為本節中的函數的參數。我們只需略微修改 dict 的調用,將 dict([…])改成 dict(…)(移除臨近圓括號的方括號),就能享受進一步的簡化和速度的提升。不過這些修改不適用 Python2.3,因為它只支持列表推導而不支持生成器表達式。

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

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

相關文章

VMware Ubuntu 網絡配置全攻略:從斷網到暢通無阻

一、網絡連接模式選擇(先搞懂原理) VMware提供三種網絡模式,就像手機的不同網絡套餐: 模式適用場景特點類比NAT個人上網/新手首選虛擬機共享主機IP,能上網但隱身家用WiFi橋接服務器/需要被局域網訪問虛擬機會獲得獨立…

鏈表(C++)

這是本人第二次學習鏈表,第一次學習鏈表是在大一上的C語言課上,首次接觸,感到有些難;第二次是在大一下學習數據結構時(就是這次),使用C再次理解鏈表。同時,這也是開啟數據結構學習寫…

【SPP】藍牙串口協議應用層深度解析:從連接建立到實戰開發

目錄 一、SPP應用層協議框架與角色模型 1.1 分層協議棧模型 1.2 設備角色模型(DevA 與 DevB 交互) 二、連接建立流程:從 SDP 到 RFCOMM 2.1 服務發現(SDP)流程(SDP 記錄關鍵參數) 2.2 連接…

Giteki 認證:無線產品進入日本市場的關鍵保障

目錄 適用產品認證范圍 認證項目及技術要求 認證流程 認證周期 與其他認證的對比 常見問題 注意事項 Giteki 認證,其名稱來源于日本語 “技適マーク”,羅馬字拼寫為 “GITEKI” ,在行業內也常被稱為 Telec 認證、MIC 認證、RF 認證或技…

Ubuntu24.04 配置遠程桌面服務

一:安裝 sudo apt update sudo apt install vino 二:設置 gsettings set org.gnome.Vino require-encryption false # 關閉加密(某些 VNC 客戶端不支持加密) gsettings set org.gnome.Vino prompt-enabled false # 關閉連接…

人工智能與軟件工程結合的發展趨勢

AI與軟件工程的結合正在深刻改變軟件開發的流程、工具和方法,其發展方向涵蓋了從代碼生成到系統維護的整個生命周期。以下是主要的發展方向和技術趨勢: 1. 軟件架構體系的重構 從“面向過程”到“面向目標”的架構轉型: AI驅動軟件設計以目標…

轉發和重定向的區別詳解

轉發(Forward)和重定向(Redirect)是 Web 開發中兩種常用的請求處理方式,主要用于將客戶端請求從一個資源轉移到另一個資源。它們在實現機制、行為表現和應用場景上有顯著區別,以下是對兩者的詳細解析&#…

python專題1-----判斷一個變量是否是字符串類型

在 Python 中,可以使用 isinstance() 函數來判斷一個變量是否是字符串類型。字符串在 Python 中是以 str 類型表示的。下面是一些示例代碼,展示如何判斷一個變量是否是字符串類型: # 示例變量 var1 "Hello, World!" var2 12345 …

軟件工程之需求工程(需求獲取、分析、驗證)

一、需求獲取(Requirements Elicitation) 1. 定義與目標 需求獲取是通過與用戶、利益相關者等交互,識別并捕獲系統需求的過程,目標是明確用戶意圖與業務目標,避免后期因需求偏差導致返工。 2. 主要方法 問卷法&…

Java簡單生成pdf

生成這樣的PDF 直接上代碼 public static void main(String[] args) {String logoPath "Q:\\IdeaWork\\Demo\\src\\main\\webapp\\images\\logo.jpg"; // 替換為實際路徑String baseDir "E:/Demo/TEST/problem/Generate"; // 基礎目錄int year 2025; //…

k8s存儲介紹(六)StorangeClass

一、Kubernetes 存儲類(StorageClass)詳解 1. 什么是 StorageClass? 在 Kubernetes 中,StorageClass(存儲類)是一種用于動態創建 PersistentVolume(PV)的資源對象。它允許管理員根…

C++:allocator類(動態數組續)

1.為什么需要 allocator? 在 C 中,動態內存管理通常通過 new 和 delete 完成: int* p new int; // 分配內存 構造對象 delete p; // 析構對象 釋放內存 但 new 和 delete 有兩個問題: 耦合性:將內…

北斗導航 | 中國北斗衛星導航系統的發展歷程——“三步走”戰略:背景,信號頻點,調制方式,短報文,等

中國北斗衛星導航系統的發展歷程按照“三步走”戰略逐步推進,從區域服務到全球覆蓋,形成了北斗一號、北斗二號、北斗三號三代系統的迭代升級,展現了中國航天科技的自主創新與突破。以下是各階段的核心內容與發展特點綜述:一、北斗一號:中國衛星導航的奠基(1994-2003年) …

Headless Chrome 優化:減少內存占用與提速技巧

在當今數據驅動的時代,爬蟲技術在各行各業扮演著重要角色。傳統的爬蟲方法往往因為界面渲染和資源消耗過高而無法滿足大規模數據采集的需求。本文將深度剖析 Headless Chrome 的優化方案,重點探討如何利用代理 IP、Cookie 和 User-Agent 設置實現內存占用…

英偉達GB300新寵:新型LPDDR5X SOCAMM內存

隨著人工智能(AI)、機器學習(ML)和高性能計算(HPC)應用的快速發展,對于高效能、大容量且低延遲內存的需求日益增長。NVIDIA在其GB系列GPU中引入了不同的內存模塊設計,以滿足這些嚴格…

靜態網頁應用開發環境搭建實戰教程

1. 前言 靜態網頁開發是前端工程師的基礎技能之一,無論是個人博客、企業官網還是簡單的Web應用,都離不開HTML、CSS和JavaScript。搭建一個高效的開發環境,能夠極大提升開發效率,減少重復工作,并優化調試體驗。 本教程…

Python每日一題(9)

Python每日一題 2025.3.29 一、題目二、分析三、源代碼四、deepseek答案五、源代碼與ai分析 一、題目 question["""企業發放的獎金根據利潤提成。利潤(I)低于或等于10萬元時,獎金可提10%,利潤高于10萬元,低于20萬元時,低于10萬元的部分按10%提成,高于10萬元的部…

游戲引擎學習第187天

看起來觀眾解決了上次的bug 昨天遇到了一個相對困難的bug,可以說它相當棘手。剛開始的時候,沒有立刻想到什么合適的解決辦法,所以今天得從頭開始,逐步驗證之前的假設,收集足夠的信息,逐一排查可能的原因&a…

【入門初級篇】布局類組件的使用(1)

【入門初級篇】布局類組件的使用(1) 視頻要點 (1)章節大綱介紹 (2)布局類組件類型介紹:行布局、列布局、標題 (3)實操演示:列表統計查詢布局模型 點擊訪問my…

對內核fork進程中寫時復制的理解記錄

前言 文章寫于學習Redis時對aof后臺重寫中寫時復制的疑問 一、感到不理解的歧義 在部分技術文檔中(以小林的文章為例),對寫時復制后的內存權限存在如歧義: ! 二、正確技術表述 根據Linux內核實現(5.15版本&#x…