」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何用Python實現高效率的雙向雜湊表?

如何用Python實現高效率的雙向雜湊表?

發佈於2024-11-17
瀏覽:574

How to Implement an Efficient Bidirectional Hash Table in Python?

實現高效的雙向哈希表

雙向哈希表允許鍵到值和值到鍵的查找。雖然 Python 的內建 dict 資料結構在鍵到值查找方面表現出色,但它並不能提供有效的值到鍵檢索。

實現雙向雜湊表的有效方法是利用類別擴展了標準字典。此類別名為 bidict,維護一個逆目錄,該目錄會根據對常規 dict 的任何修改自動更新。

程式碼實作:

class bidict(dict):
    def __init__(self, *args, **kwargs):
        super(bidict, self).__init__(*args, **kwargs)
        self.inverse = {}
        for key, value in self.items():
            self.inverse.setdefault(value, []).append(key) 

    def __setitem__(self, key, value):
        if key in self:
            self.inverse[self[key]].remove(key) 
        super(bidict, self).__setitem__(key, value)
        self.inverse.setdefault(value, []).append(key)        

    def __delitem__(self, key):
        self.inverse.setdefault(self[key], []).remove(key)
        if self[key] in self.inverse and not self.inverse[self[key]]: 
            del self.inverse[self[key]]
        super(bidict, self).__delitem__(key)

主要特點:

  • 逆目錄(bd.inverse)是字典,它將值映射到具有該值的鍵列表。
  • 修改 bidict 時,反向目錄會自動更新。
  • 與某些不同bidict 實現,該類別允許多個鍵具有相同的值。

用法範例:

bd = bidict({'a': 1, 'b': 2})  
print(bd)                     # {'a': 1, 'b': 2}                 
print(bd.inverse)             # {1: ['a'], 2: ['b']}
bd['c'] = 1                   # Now two keys have the same value (= 1)
print(bd)                     # {'a': 1, 'c': 1, 'b': 2}
print(bd.inverse)             # {1: ['a', 'c'], 2: ['b']}
del bd['c']
print(bd)                     # {'a': 1, 'b': 2}
print(bd.inverse)             # {1: ['a'], 2: ['b']}
del bd['a']
print(bd)                     # {'b': 2}
print(bd.inverse)             # {2: ['b']}
bd['b'] = 3
print(bd)                     # {'b': 3}
print(bd.inverse)             # {2: [], 3: ['b']}

How to Implement an Efficient Bidirectional Hash Table in Python?

bd = bidict({'a': 1、'b':2}) print(bd) # {'a': 1, 'b': 2} print(bd.inverse) # {1: ['a'], 2: ['b']} bd['c'] = 1 # 現在兩個鍵具有相同的值 (= 1) print(bd) # {'a': 1, 'c': 1, 'b': 2} print(bd.inverse) # {1: ['a', 'c'], 2: ['b']} 德爾 bd['c'] print(bd) # {'a': 1, 'b': 2} print(bd.inverse) # {1: ['a'], 2: ['b']} 德爾 bd['a'] 印(bd) # {'b': 2} print(bd.inverse) # {2: ['b']} bd['b'] = 3 印出(bd) # {'b': 3} print(bd.inverse) # {2: [], 3: ['b']}

最新教學 更多>
  • 發現漸進式 Web 應用程式為您的下一個專案帶來的最大優勢
    發現漸進式 Web 應用程式為您的下一個專案帶來的最大優勢
    Progressive online Apps, or PWAs, are quickly changing the online development landscape. PWAs are becoming the ideal way to connect mobile application...
    程式設計 發佈於2024-11-17
  • 現代 C++ 實作中的 std::list::size() 真的是 O(1) 嗎?
    現代 C++ 實作中的 std::list::size() 真的是 O(1) 嗎?
    在現代實作 std::list::size() 真的是 O(n) 嗎? 最近,一些開發人員建議std::list::size() 具有線性時間複雜度 (O(n))。但是,根據 C 標準,複雜性沒有定義,並且可能會根據實現而變化。 在 C 標準的早期版本 (C 03) 中,建議 size() 操作具有...
    程式設計 發佈於2024-11-17
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-17
  • 如何在 Heroku 上建立對 ClearDB MySQL 資料庫的遠端存取?
    如何在 Heroku 上建立對 ClearDB MySQL 資料庫的遠端存取?
    在 Heroku 上遠端存取 ClearDB MySQL 資料庫遠端查詢 ClearDB MySQL 資料庫可以透過 MySQL 查詢瀏覽器等工具來實現。要建立連接,您需要以下資訊:獲取資料庫憑證和連接詳細資訊:導航至Heroku 網站並選擇“My應用程式。” 選擇與ClearDB 資料庫關聯的應用...
    程式設計 發佈於2024-11-17
  • 何時選擇 IFNULL 而不是 COALESCE 以獲得最佳性能?
    何時選擇 IFNULL 而不是 COALESCE 以獲得最佳性能?
    效能比較:IFNULL 與COALESCE當資料庫列只能有兩個候選值時,IFNULL 和COALESCE 都可以用來檢索非空值。然而,目前還不清楚哪個函數更快。 調查儘管相信IFNULL 更優越,但軼事證據表明COALESCE 可能同等甚至更高效.基準測試注意事項確定哪個函數是真正更快,有必要針對特...
    程式設計 發佈於2024-11-17
  • 如何使用 Access-SQL 中的內連線從多個表中擷取資料?
    如何使用 Access-SQL 中的內連線從多個表中擷取資料?
    Access-SQL:多表內連接在Access資料庫中處理多個互連表時,需要檢索資料無縫地從多個來源。一種有效的方法是利用內聯接,它允許根據匹配值從多個表中檢索資料。 要擷取跨越多個資料表的特定值,可以使用下列查詢:SELECT tblOjt.ID, tblStudent.Lastname,...
    程式設計 發佈於2024-11-17
  • 為什麼我的 Less.js 無法在 Chrome 中運作?
    為什麼我的 Less.js 無法在 Chrome 中運作?
    Less.js 在Chrome 中沒有回應Less.js 在Firefox 中的功能在Chrome 中仍然沒有回應,這引起了人們的擔憂。要確定原因,讓我們檢查提供的程式碼:<link rel="stylesheet/less" href="css/style.le...
    程式設計 發佈於2024-11-17
  • 如何使用 PHP 的 json_encode() 函數正確編碼 JSON 中的特殊字元?
    如何使用 PHP 的 json_encode() 函數正確編碼 JSON 中的特殊字元?
    JSON 編碼與特殊字元使用json_encode() 函數對陣列進行編碼時,可能會發生包含特殊字元的元素被轉換為空字串。對於版權或商標符號等字符,此行為尤其明顯。 要解決此問題,請確保所有字串資料都經過 UTF-8 編碼,然後再將其編碼為 JSON。這可以透過將 array_map() 與 utf...
    程式設計 發佈於2024-11-17
  • ## 儘管查詢成功,為什麼我的 Go-GORM 結構欄位仍傳回預設值?
    ## 儘管查詢成功,為什麼我的 Go-GORM 結構欄位仍傳回預設值?
    訪問Go-GORM 結構中的查詢結果您遇到的問題是查詢結果為“res”結構儘管查詢執行成功,但仍保留預設值。這與 Go-GORM 中的命名約定有關。 要解決這個問題,您可以使用公共欄位來讓您的 'res' 類型可公開存取:type Res struct { ID int ...
    程式設計 發佈於2024-11-17
  • 如何從 MySQL 中的多個欄位中選擇不同的值組合?
    如何從 MySQL 中的多個欄位中選擇不同的值組合?
    在MySQL 中從多列中選擇不同的值使用資料庫時,通常需要從多列中檢索唯一的值組合。但是,使用 DISTINCT 關鍵字可能無法總是產生所需的結果。本文探討了從 MySQL 資料庫中的兩列中選擇不同值的另一種方法。 考慮以下名為「foo_bar」的表格:foo欄accccfd ]acacafcacd...
    程式設計 發佈於2024-11-17
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-17
  • 如何使用 Goose 解決 PostgreSQL 函數中的“未終止的美元引用字串”錯誤?
    如何使用 Goose 解決 PostgreSQL 函數中的“未終止的美元引用字串”錯誤?
    未終止的美元引用字串:用分號解決錯誤在使用Goose 創建PostgreSQL 函數的上下文中,本文解決了一個錯誤在處理函數體內的複雜語句時遇到。 pq 庫報告的錯誤表明美元引用的字串仍未終止。 要解決此問題,請注意以分號為特徵的複雜語句需要使用“-- goose StatementBegin”和“...
    程式設計 發佈於2024-11-17
  • 如何從 PHP 網站執行 Java 程式?
    如何從 PHP 網站執行 Java 程式?
    從PHP 網站利用Java 的運算能力肩負著讓您的網站使用者能夠從內部執行Java 程式的使命瀏覽器中,本指南將深入研究連接這兩個世界的複雜性。 從PHPPHP 值得信賴的 exec() 函數成為彌補這一差距的首選武器。它使您能夠在 PHP 的懷抱中呼叫帶有參數的任何 Java 程式。像這樣的簡單語...
    程式設計 發佈於2024-11-17
  • 了解堆疊資料結構:在 JavaScript 中實作堆疊的逐步指南
    了解堆疊資料結構:在 JavaScript 中實作堆疊的逐步指南
    堆栈是一种简单的线性数据结构,其工作原理就像一堆盘子?️。它遵循后进先出 (LIFO) 原则。将其视为一堆盘子:您只能添加或删除堆顶部的盘子。 为了更好的理解栈,让我们来一次短暂的想象之旅吧?. 想象一下您在一家高档餐厅??️,厨房工作人员正在为忙碌的夜晚做准备??‍?。在餐具区,有一大堆盘子等待使...
    程式設計 發佈於2024-11-17
  • 如何在不使用 if/else 語句的情況下在 CSS 中實作條件邏輯?
    如何在不使用 if/else 語句的情況下在 CSS 中實作條件邏輯?
    CSS 中的條件語句:另一種方法在現代Web 開發中,基於動態變數無縫調整使用者體驗至關重要。 CSS 雖然在樣式方面功能強大,但缺乏 if/else 等傳統條件語句。然而,有幾種替代方法可以實現類似的功能。 一種方法是利用類別。透過使用特定類別操作 HTML 元素,您可以根據這些類別的存在或不存在...
    程式設計 發佈於2024-11-17

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3