簡體   English   中英

在Python中每個值具有多個鍵的字典

[英]Dictionaries with more than one key per value in Python

我試圖創建一個不錯的接口來訪問數據集,其中每個值都有幾個可能的鍵。 例如,假設我對數據集中的每個值都有一個數字和一個名稱 我希望能夠使用數字或名稱訪問每個值。

我考慮了幾種可能的實現:

  1. 使用兩個單獨的字典,一個用於按數字組織的數據值,另一個用於按名稱組織的數據值。

  2. 只需將兩個鍵分配給字典中的相同值。

  3. 創建將每個名稱映射到相應數字的字典,反之亦然

  4. 試圖創建一個將每個名稱映射到一個數字等的哈希函數(與上述相關)

  5. 創建一個對象以封裝所有三段數據,然后使用一個鍵將字典鍵映射到對象,然后簡單地搜索字典以將另一個鍵映射到對象。

這些似乎都不理想。 第一個看起來很丑陋且難以維護。 第二個似乎也很脆弱。 第三/第四點似乎是合理的,但似乎需要很多手動說明或過於復雜的實現。 最后,第五個查詢之一失去了恆定時間性能。

在C / C ++中,我相信我會使用指針來引用來自不同鍵的相同數據。

我知道這個問題與非關鍵列的數據庫查找問題非常相似,但是,我希望(如果可能)保持Python字典的近似O(1)性能。

實現此數據結構的最Pythonic方法是什么?

In C/C++, I believe that I would use pointers to reference the same piece of 
data from different keys.

這將對應於選項號2。在Python中,字典實際上存儲指向對象的指針。 這意味着具有兩個鍵指向同一對象將不會兩次創建該對象。

名稱和數字都唯一嗎? 首先,使用一個查找另一個不是很糟糕。

指向相同數據的兩個字典(如C中的字典)不會復制數據,也很好。

使用add(name,number,value)findByName(name)findByNumber(number)將兩個字典組合成一個獨立的對象,可以使您集中維護,進行測試等。

(原諒我的駱駝案:)

這樣看:本質上來說,您希望擁有一個三列數據庫,其中兩個列都已建立索引,但是為了簡化起見,您不想查找索引值。

在實踐中,選項5試圖建立這樣一個簡化的數據庫。 當在內存中建立這樣的數據庫時,最終會得到一個從UID到您擁有的值的映射(在這種情況下,只有一個,因為您只有一個值“ column”),索引正在從值映射到UID 。

在您的情況下,您已經有一個可用作UID的數字,因此您不需要“列”。

這意味着您將獲得兩個字典:一個將數字映射到值,另一個將名稱映射到數字。

IMO,這就是您應該做的。

在C / C ++中,我相信我會使用指針來引用來自不同鍵的相同數據。

Python中的幾乎所有內容都可以稱為“ C / C ++指針”。

使用選項#1,兩個字典,並對其性能進行測試。 如果為內容定義一個類,則構造函數和析構函數可以管理字典,並且該類可以為查找定義函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM