2017-05-04 276 views
1

我有一本字典master,其中包含大約50000到100000個唯一列表,它們可以是簡單列表或列表列表。每個列表被分配到一個特定ID(這是字典的鍵):Python:「散列」嵌套列表

master = {12: [1, 2, 4], 21: [[1, 2, 3], [5, 6, 7, 9]], ...} # len(master) is several ten thousands 

現在我有幾百這又包含大約10000名單dictionarys的(同上:可以嵌套)。

a = {'key1': [6, 9, 3, 1], 'key2': [[1, 2, 3], [5, 6, 7, 9]], 'key3': [7], ...} 

我這個數據爲基準的每一個詞典要相互參照我master中,即不是保存內a每一個名單,我想只有存儲的標識:這些類型的字典的一個實例master以防列表出現在master中。

=> a = {'key1': [6, 9, 3, 1], 'key2': 21, 'key3': [7], ...} 

我能做到這一點通過循環遍歷amaster所有值的所有值,並嘗試以匹配列表(通過對它們進行排序),但會採取年齡。

現在我想知道你會如何解決這個問題? 我想在master每個列表「散列」爲唯一的字符串,並將其保存爲一個新的master_inverse參考字典的關鍵,例如:

master_inverse = {hash([1,2,4]): 12, hash([[1, 2, 3], [5, 6, 7, 9]]): 21} 

那麼這將是非常簡單的看它以後:

for k, v in a.items(): 
    h = hash(v) 
    if h in master_inverse: 
    a[k] = master_inverse[h] 

你有更好的主意嗎? 這樣的散列看起來怎麼樣?有沒有內置的方法已經是快速和獨特的?

編輯: 說不上來爲什麼我沒有拿出立即使用這種方法: 你覺得使用或者鹹菜或再版()任何一個列表的M5哈希的?

事情是這樣的:

import hashlib 
def myHash(str): 
    return hashlib.md5(repr(str)).hexdigest() 

master_inverse = {myHash(v): k for k, v in master.items()} 

for k, v in a.items(): 
    h = myHash(v) 
    if h in master_inverse: 
    a[k] = master_inverse[h] 

EDIT2: 我坐在板凳上吧:要檢查一百類型的字典中的一個(在我的例子aa包含了我的20K左右的值基準)對我的master_inverse是非常快,沒想到:0.08秒。所以我想我可以適應得很好。

回答

1

MD5方法可行,但在使用MD5哈希時,您需要注意緩存衝突的可能性非常小(請參閱How many random elements before MD5 produces collisions?瞭解更多信息)。

如果您需要絕對確保程序正常工作,您可以將列表轉換爲元組並創建字典,其中鍵是您創建的元組,並且值是您的主字典中的鍵(與master_inverse相同,但具有完整值而非MD5散列值)。

有關如何使用元組作爲字典鍵的更多信息:http://www.developer.com/lang/other/article.php/630941/Learn-to-Program-using-Python-Using-Tuples-as-Keys.htm