2017-05-04 13 views
1

私は辞書masterに約50000から100000個のユニークなリストを持ちます。これは簡単なリストでもリストのリストでもかまいません。すべてのリストは、(辞書のキーです)、特定のIDに割り当てられている:Python:ネストされたリストの "Hash"

master = {12: [1, 2, 4], 21: [[1, 2, 3], [5, 6, 7, 9]], ...} # len(master) is several ten thousands 

今、私は再び周り10000リスト含まdictionarysの数百持っている(上記と同じ:入れ子にすることができますが)。これらのdictsの一つの例:

a = {'key1': [6, 9, 3, 1], 'key2': [[1, 2, 3], [5, 6, 7, 9]], 'key3': [7], ...} 

私はすなわち代わりにa内のすべてのリストを保存するので、私は唯一のIDを格納したい、私のmasterを参照してすべての単一の辞書のためのクロスリファレンスにこのデータが必要リストがmasterにある場合はmasterです。

私は a内のすべての値および masterのすべての値を超えるループすることにより、それを行うと、(それらをソートすることによって)リストと一致するように試みることができる
=> a = {'key1': [6, 9, 3, 1], 'key2': 21, 'key3': [7], ...} 

、それは年齢を取りますよ。

今、どうすればこの問題を解決できますか? 私は例えば、一意の文字列に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] 

は、あなたがより良いアイデアを持っていますか? このようなハッシュはどのように見えるでしょうか?既に高速かつユニークな組み込みメソッドが既に存在しますか?

EDIT: 知らんは、なぜ私はこのアプローチを瞬時に思い付くしませんでした: あなたは漬物やの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: 私はそれをベンチ:百枚のdictsのいずれかをチェックするには(私の例aでは、aは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

関連する問題