Python:“哈希”嵌套列表

时间:2017-05-04 11:58:45

标签: python list dictionary hash

我有一个字典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秒。所以我想我可以用得那么好。

1 个答案:

答案 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