我有一个字典master
,其中包含大约50000到100000个唯一列表,可以是简单列表,也可以是列表列表。每个列表都分配给一个特定的ID(这是字典的关键字):
master = {12: [1, 2, 4], 21: [[1, 2, 3], [5, 6, 7, 9]], ...} # len(master) is several ten thousands
现在我有几百个dictionarys,它们再次包含大约10000个列表(与上面相同:可以嵌套)。其中一个例子的例子:
a = {'key1': [6, 9, 3, 1], 'key2': [[1, 2, 3], [5, 6, 7, 9]], 'key3': [7], ...}
我希望在引用我的master
时为每个字典交叉引用这些数据,即不是保存a
内的每个列表,我只想存储{{1}的ID如果列表出现在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}
你有更好的主意吗? 这样的哈希怎么样?是否已经有一种快速而独特的内置方法?
修改: Dunno为什么我没有立即采用这种方法: 您如何看待使用pickle或repr()任何单个列表的m5-hash?
这样的事情:
for k, v in a.items():
h = hash(v)
if h in master_inverse:
a[k] = master_inverse[h]
EDIT2 :
我对它进行了修改:要检查我的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]
中的一个(在我的示例a
中,a
包含我的基准值大约20k值)对我master_inverse
非常快,没想到:0.08秒。所以我想我可以用得那么好。
答案 0 :(得分:1)
MD5方法可行,但在使用MD5哈希时,需要注意缓存冲突的可能性非常小(请参阅How many random elements before MD5 produces collisions?了解更多的deitals)。
如果您需要确保程序正常工作,您可以将列表转换为元组并创建字典,其中键是您创建的元组,值是主字典中的键(与master_inverse
相同,但是已满)值而不是MD5哈希值)。
有关如何将元组用作字典键的更多信息:http://www.developer.com/lang/other/article.php/630941/Learn-to-Program-using-Python-Using-Tuples-as-Keys.htm。