2017-03-21 12 views
1

私はPythonで辞書を作成しましたが、これはいくつかのサンプルコードです。Python 2で辞書を検索する

filesAndHashes = dict() 
... 
>>>print filesAndHashes 
{ 
"/home/rob/Desktop/test.txt":"1c52fe8fbb1463d541c2d971d9890c24", 
"/home/rob/Desktop/file.dat":"6386ba70e82f11aa027bfc9874cd58cb", 
"/home/rob/Desktop/test2.exe":"5b73c2a88fab97f558a07d40cc1e9d8e" 
} 

これはすべて、ファイルパスとファイルのMD5です。

私が今やりたいことは、MD5の中に興味のあるものが見つかってリストを作成し、リスト内の各MD5を検索して各ハッシュのファイルパスを私に返すことです。

また、プログラムが動作する方法では、辞書にないMD5が私のリストに存在することはありません。そのため、エラーチェックの心配はありません。

私の情報をお気軽にお尋ねください

ありがとうございます。

+0

ハッシュは一意であることが保証されていますか? – timgeb

+0

はい@timgeb、それは毎回最大約6つのファイルをスキャンするためです –

答えて

2

あなたは、パスを持っている - >ハッシュマッピングができますが、ハッシュ必要 - >パスマッピングを。 、

>>> hashes = ['456'] 
>>> for hash in hashes: 
...  filename = hashesAndFiles[hash] 
...  print(filename) 
... 
bar 

あなたは理論的には可能である、ハッシュは一意ではないことを除外することはできない場合は、次のハッシュが一意であると仮定すると、辞書に

>>> filesAndHashes = {'foo': '123', 'bar': '456'} 
>>> hashesAndFiles = {hash:fname for fname,hash in filesAndHashes.iteritems()} 
>>> hashesAndFiles 
{'123': 'foo', '456': 'bar'} 

を逆に今ちょうどあなたのリストを反復処理し、マッチを報告defaultdictを使用してください。

>>> from collections import defaultdict 
>>> hashesAndFiles = defaultdict(list) 
>>> 
>>> filesAndHashes = {'foo': '123', 'bar': '456', 'baz': '456'} 
>>> for fname, hash in filesAndHashes.items(): 
...  hashesAndFiles[hash].append(fname) 
... 
>>> hashesAndFiles 
defaultdict(<type 'list'>, {'123': ['foo'], '456': ['baz', 'bar']}) 
>>> 
>>> hashes = ['456'] 
>>> for hash in hashes: 
...  for filename in hashesAndFiles[hash]: 
...   print(filename) 
... 
baz 
bar 

キャッチKeyErrors必要に応じて(あなたの質問から私はあなたのリスト内の任意の非既存のハッシュを期待していないと仮定しました)。

0

ハッシュで検索したいので、キーがハッシュになるように辞書を逆順にします。

はその後、単純に辞書内のキーを検索:filesAndHashes_reversed.get(hash_value, None)

filesAndHashes_reversed = { value: key for key, value in filesAndHashes.iteritems() } 
hash_list = [ hash_1,hash_2, hash_3, ] 
for hash in hash_list: 
    if filesAndHashes_reversed.get(hash, None) == None: 
     print("Not Found") 
    else: 
     print(filesAndHashes_reversed.get(hash, None)) 
0

おそらくあなたは適切なアプローチを使用していないかもしれませんが、まず質問されたように質問に答えます。これは最初の試合であることを

def find_item(md5hash) 
    for k,v in a.iteritems(): 
    if v == md5hash: 
     return k 

注:

は、あなたがこれを行うことができます最初のマッチを見つけるために。理論的には同じハッシュで複数のエントリを持つことは可能ですが、OPはハッシュが一意であると予想されています。しかし、そのような場合にキーとして使用してみませんか?これにより、検索が容易になります。

hashes_and_files = dict() 

hashes_and_files["1c52fe8fbb1463d541c2d971d9890c24"]="/home/rob/Desktop/test.txt" 
hashes_and_files["6386ba70e82f11aa027bfc9874cd58cb"]="/home/rob/Desktop/file.dat" 
hashes_and_files["5b73c2a88fab97f558a07d40cc1e9d8e"]="/home/rob/Desktop/test2.exe" 

#finding is trivial 

find_hash = "5b73c2a88fab97f558a07d40cc1e9d8e" 
file_name = hashes_and_files["5b73c2a88fab97f558a07d40cc1e9d8e"] 
関連する問題