2017-05-04 199 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