Python:“散列”嵌套列表
我有一本字典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], ...}
我能做到这一点通过循环遍历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]
你有更好的主意吗? 这样的散列看起来怎么样?有没有内置的方法已经是快速和独特的?
编辑: 说不上来为什么我没有拿出立即使用这种方法: 你觉得使用或者咸菜或再版()任何一个列表的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: 我坐在板凳上吧:要检查一百类型的字典中的一个(在我的例子a
,a
包含了我的20K左右的值基准)对我的master_inverse
是非常快,没想到:0.08秒。所以我想我可以适应得很好。
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。