Python Cookbook-4.14 反轉字典

任務

給定一個字典,此字典將不同的鍵映射到不同的值。而你想創建一個反轉的字典,將各個值反映射到鍵。

解決方案

可以創建一個函數,此函數傳遞一個列表推導作為dict的參數以創建需要的字典。

def invert_dict(d):return dict([(v,k) for k,v in d.iteritems() ])

對于比較大的字典,用 Python 標準庫 itertools 模塊提供的 izip 會更快一些:

from itertools import izip
def invert_dict_fast(d):return dict(izip(d.itervalues(),d.iterkeys()))

討論

如果字典d中的值不是獨一無二的,那么d無法被真正地反轉,也就是不存在這樣的字典,對于任意給定的鍵k,滿足id[d[k]]==k。不過,本節展示的函數在這種情況下仍然能夠創建一個“偽反轉”字典 pd,對于任何屬于字典d地值 v,d[pd[v]]==v。如果給你原始的字典 d,以及用本節函數獲得的字典x,可以很容易地檢査x是d的反轉字典還是偽反轉字典:當且僅當 len(x)==len(d)時,x才是d的真正的反轉字典。這是因為,如果兩個不同的鍵對應相同的值,對于解決方案給出的兩個函數來說,兩個鍵中的個一定會消失,因而生成的偽反轉字典的長度也會比原字典的長度短。在任何情況下只有當d中的值是可哈希(hashable,意味著可以用它們做字典的鍵)的,前面展示的函數才能正常工作,否則,函數會拋出一個TypeError 異常。

當我們編寫 Python程序時,我們通常會“無視小的優化”,正如DonaldKnuth在 30年前所說的“比起速度,我們更珍視清晰和正確性。”不過,了解更多讓程序變快的知識也沒有害處:當我們為了簡單和清晰而采用某種方法編寫程序時,我們最好深入地考慮一下我們的決定,不要懵懵懂懂。

在這里,解決方案中的 invent_dict 函數可能會被認為更清晰,因為它清楚地表達了它在做的事。該函數取得了由iteritems方法生成的成對的鍵及其對應值k和v,將它們包裹成(value,key)的順序,并把最后生成的序列作為參數賦給 dict,這樣 dict 就構建出了一個值成為鍵,而原先的鍵變成了對應值的新字典——正是我們需要的反轉字典。

而解決方案中 invert_dict_fast 函數其實也沒有那么復雜,它的操作更加抽象,它首先將所有的鍵和值分別轉為兩個獨立的迭代器,再通過調用Python 標準庫itertools 模塊提供的 izip 將兩個迭代器轉化為一個迭代器,其中每個元素都是像(value,key)一樣的一對值。如果你能夠習慣于這種抽象層次,你將體會到更高層次的簡潔和清晰。

由于這種高度的抽象性,以及不具化(materialize)整個列表(而是通過生成器和迭代器一次生成一項)的特性,invert_dict_fast能夠比invert_dict 快很多。比如,在我的計算機上,反轉10000個條目的字典,invertdict耗時63ms,而invert_dict_fast 則僅用時 20ms。速度提升了3倍,頗為可觀。當你處理大規模數據時,由于代碼的高度抽象性而帶來的性能提升將會變得更加明顯。特別是當你使用itertools來替換循環和列表推導時,執行速度同樣也能獲得極大提升,因為你無須在內存中具化一些超大的列表。當你習慣了更高的抽象層次,性能的提升只是一個額外收益,除此之外,你在觀念和創造性上也會有所進步。

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

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

相關文章

深度學習在測距模型中的應用

一、單目視覺測距和雙目視覺測距簡介 1、單目視覺測距 模型:深度估計(Depth Estimation) 原理:通過深度學習模型(如MonoDepth2、MiDaS)或傳統的計算機視覺方法(如單目相機結合物體大小推斷&am…

Linux Mem -- Slub內存分配器的幾點疑問及解答

目錄 1 怎樣通過object地址獲取其對應的struct slab? 2 struct page、struct folio和struct slab類型之間轉換,怎么保證內部關鍵數據的傳遞? 3 怎樣判斷一個內存空間是屬于slab、page管理? 4 struct page 結構中 __mapcou…

pip install cryptacular卡住,卡在downloading階段

筆者安裝pip install cryptacular卡在downloading階段,但不知道為何 Collecting cryptacularCreated temporary directory: /tmp/pip-unpack-qfbl8f08http://10.170.22.41:8082 "GET http://repo.huaweicloud.com/repository/pypi/packages/42/69/34d478310d6…

Lag-Llama時間序列模型簡單實現數據預測

前言: 最近在大模型預測,簡單了解了lag-llama開源項目,網上也有很多講解原理的,這里就將如何快速上手使用說一下,只懂得一點點皮毛,有錯誤的地方歡迎大佬指出。 簡單介紹: Lag-Llama 是一個開…

Plastiform復制膠泥:高精度表面復制與測量的高效工具

在工業制造和質量檢測領域,表面復制和測量是確保產品質量的關鍵環節。Plastiform復制膠泥作為一種創新材料,憑借其出色的性能和多樣化的應用,為用戶提供了可靠的解決方案。它能夠快速捕捉復雜表面的細節,確保測量結果的準確性&…

AI大模型、機器學習以及AI Agent開源社區和博客

以下梳理了適合學習 AI大模型、機器學習、AI Agent和多模態技術 的英文網站、社區、官網和博客,按類別分類整理: 一、官方網站與開源平臺 1. AI大模型 (Large Language Models) ? OpenAI ? 官網: openai.com ? 內容: GPT系列模型文檔、研究論文、AP…

python 上下文管理器with

with 上下文管理器 上下文管理器示例如下:若想不使用with關鍵字 上下文管理器 任何實現了 enter() 和 exit() 方法的對象都可稱之為上下文管理器,上下文管理器對象可以使用 with 關鍵字。 必須同時具有__enter__和__exit__,就可以使用with語句…

買賣股票的最佳時機(121)

121. 買賣股票的最佳時機 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int cur_min prices[0];int max_profit 0;for (int i 1; i < prices.size(); i) {if (prices[i] > cur…

CesiumJS 本地數據瓦片加載南北兩極出現圓點問題

const imageryProvider new UrlTemplateImageryProvider({url: "/gisimg/{z}/{x}/{reverseY}.png",minimumLevel: 0,maximumLevel: 19})上面這段代碼是加載本地切片&#xff0c;但是有個致命問題就是會出現南北兩極顯示藍色圓點 解決方案&#xff1a; 加上這句話&am…

Linux編譯器gcc/g++使用完全指南:從編譯原理到動靜態鏈接

一、gcc/g基礎認知 在Linux開發環境中&#xff0c;gcc和g是我們最常用的編譯器工具&#xff1a; gcc&#xff1a;GNU C Compiler&#xff0c;專門用于編譯C語言程序g&#xff1a;GNU C Compiler&#xff0c;用于編譯C程序&#xff08;也可編譯C語言&#xff09; &#x1f4cc…

Vue學習筆記集--computed

computed 在 Vue 3 的 Composition API 中&#xff0c;computed 用于定義響應式計算屬性 它的核心特性是自動追蹤依賴、緩存計算結果&#xff08;依賴未變化時不會重新計算&#xff09; 基本用法 1. 定義只讀計算屬性 import { ref, computed } from vue;const count ref(…

飛致云榮獲“Alibaba Cloud Linux最佳AI鏡像服務商”稱號

2025年3月24日&#xff0c;阿里云云市場聯合龍蜥社區發布“2024年度Alibaba Cloud Linux最佳AI鏡像服務商”評選結果。 經過主辦方的嚴格考量&#xff0c;飛致云&#xff08;即杭州飛致云信息科技有限公司&#xff09;憑借旗下MaxKB開源知識庫問答系統、1Panel開源面板、Halo開…

Vue如何利用Postman和Axios制作小米商城購物車----簡版

實現功能&#xff1a;全選、單選、購物數量顯示、合計價格顯示 實現效果如下&#xff1a; 思路&#xff1a; 1.數據要利用寫在Postman里面&#xff0c;通過地址來調用Postman里面的數據。 2.寫完數據后&#xff0c;給寫的數據一個名字&#xff0c;然后加上一個空數組&#xf…

第一篇:系統分析師首篇

目錄 一、目標二、計劃三、完成情況1.宏觀思維導圖2.過程中的團隊管理和其它方面的思考 四、意外之喜(最少2點)1.計劃內的明確認知和思想的提升標志2.計劃外的具體事情提升內容和標志 一、目標 通過參加考試&#xff0c;訓練學習能力&#xff0c;而非單純以拿證為目的。 1.在復…

CSS學習筆記4——盒子模型

目錄 盒子模型是什么&#xff1f; 盒子模型的組成 一、div標簽 二、邊框屬性 1、border-style:邊框樣式 2、border-width:邊框寬度 3、border-color:邊框顏色、border&#xff1a;綜合設置 4、border-radius:圓角邊框 5、border-image&#xff1a;圖像邊框 三、邊距屬性…

復現文獻中的三維重建圖像生成,包括訓練、推理和可視化

要復現《One - 2 - 3 - 45 Fast Single Image to 3D Objects with Consistent Multi - View Generation and 3D Diffusion (CVPR)2024》文獻中的三維重建圖像生成&#xff0c;包括訓練、推理和可視化&#xff0c;并且確保代碼能正常運行&#xff0c;下面是基本的實現步驟和示例…

stable diffusion 本地部署教程 2025最新版

前提&#xff1a; 需要環境 git git下載地址Git - Downloading Package ? 直接裝即可 python3.10.6 下載地址 Python Release Python 3.10.6 | Python.org ? 記得python環境一定要3.10.6&#xff01;&#xff01;&#xff01; 第一個版本 項目地址https://github.…

【二刷代碼隨想錄】螺旋矩陣求解方法、推薦習題

一、求解方法 &#xff08;1&#xff09;按點模擬路徑 在原有坐標的基準上&#xff0c;疊加 橫縱坐標 的變化值&#xff0c;求出下一位置&#xff0c;并按題完成要求。但需注意轉角的時機判斷&#xff0c;特別是最后即將返回上一出發點的位置。 &#xff08;2&#xff09;按層…

從Manus到OpenManus:AI智能體技術如何重塑未來生活場景?

從Manus到OpenManus&#xff1a;AI智能體技術如何重塑未來生活場景&#xff1f; 一、現狀&#xff1a;AI智能體技術面臨的三大核心矛盾 &#xff08;通過分析用戶高頻痛點與市場反饋提煉&#xff09; 能力與門檻的失衡 Manus展示的復雜任務處理能力&#xff08;如股票分析、代…

迭代器與可迭代對象

概念層面&#xff1a; 可迭代對象&#xff1a; 一個可迭代對象是指任何可以返回一個迭代器的對象。換句話說&#xff0c;它實現了 __iter__() 方法 比如&#xff1a;列表、元組、字典、字符串、集合等 直接通過 for 循環使用&#xff0c;因為 for 循環內部會調用其 __iter__(…