我有一本字典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], ...}
我能做到這一點通過循環遍歷a
和master
所有值的所有值,並嘗試以匹配列表(通過對它們進行排序),但會採取年齡。
現在我想知道你會如何解決這個問題? 我想在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: 我坐在板凳上吧:要檢查一百類型的字典中的一個(在我的例子a
,a
包含了我的20K左右的值基準)對我的master_inverse
是非常快,沒想到:0.08秒。所以我想我可以適應得很好。