私は辞書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秒。だから私はそれで十分に生きることができると思う。