【发布时间】:2017-10-02 14:22:33
【问题描述】:
我有一本字典master,其中包含大约 50000 到 100000 个唯一列表,这些列表可以是简单列表,也可以是列表列表。每个列表都分配给一个特定的 ID(这是字典的键):
master = {12: [1, 2, 4], 21: [[1, 2, 3], [5, 6, 7, 9]], ...} # len(master) is several ten thousands
现在我有几百个字典,其中又包含大约 10000 个列表(与上面相同:可以嵌套)。这些字典之一的示例:
a = {'key1': [6, 9, 3, 1], 'key2': [[1, 2, 3], [5, 6, 7, 9]], 'key3': [7], ...}
我想针对我的master 交叉引用每个字典的此数据,即我不想将每个列表保存在a 中,我只想存储master 的ID,以防列表存在于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]
你有更好的主意吗? 这样的哈希怎么可能看起来像?是否已经有一种快速且独特的内置方法?
编辑: 不知道为什么我没有立即提出这种方法: 您如何看待使用 pickle 或 repr() 任何单个列表的 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:
我把它放了:对照我的master_inverse检查一百个字典之一(在我的例子中a,a包含我的基准大约20k值)非常快,没想到:0.08秒。所以我想我可以忍受得很好。
【问题讨论】:
标签: python list dictionary hash