【问题标题】:Python: "Hash" a nested ListPython:“散列”一个嵌套列表
【发布时间】: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检查一百个字典之一(在我的例子中aa包含我的基准大约20k值)非常快,没想到:0.08秒。所以我想我可以忍受得很好。

【问题讨论】:

    标签: python list dictionary hash


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2013-07-08
      • 2018-11-07
      • 2013-03-14
      • 2014-07-28
      • 2014-09-13
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多