2017-03-21 3 views
1

Ich habe ein Wörterbuch in Python erstellt, das ist ein Beispielcode von ihm.Durchsuchen eines Wörterbuchs in Python 2

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

So all das ist, ist ein Dateipfad und das MD5 der Datei.

Also was ich jetzt tun möchte, ist, habe ich einige MD5 von Interesse gefunden und eine Liste von ihnen erstellt und will das Wörterbuch für jedes MD5 in meiner Liste suchen und den Dateipfad für mich für jeden Hash zurückgeben.

Auch die Art und Weise, wie das Programm funktioniert, wird es nie ein MD5 in meiner Liste geben, das nicht im Wörterbuch ist, also nicht besorgt über die Fehlerprüfung.

Wenden Sie sich bitte für meine Informationen

Dank zu fragen.

+0

Sind die Hashes garantiert einzigartig? – timgeb

+0

Ja @timgeb, da nur maximal 6 Dateien gescannt werden –

Antwort

2

Sie haben einen Pfad -> Hash-Mapping, aber Sie müssen eine Hash -> Pfad-Zuordnung. Unter der Annahme, die Hashes einzigartig sind, in umgekehrter Reihenfolge Wörterbuch

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

Jetzt nur noch über die Liste iterieren und Bericht übereinstimmt:

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

Wenn Sie nicht ausschließen können, dass Hashes nicht eindeutig zuzuordnen sind, die in der Theorie möglich ist, Verwenden Sie eine 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 

Fang KeyErrors nach Bedarf (aus Ihrer Frage, die ich angenommen, Sie keinen nicht vorhandenen Hashes in der Liste erwarten).

0

Kehren Sie das Wörterbuch um, so dass die Schlüssel die Hashes sind, da Sie mit den Hashes suchen möchten.

dann einfach für den Schlüssel im Wörterbuch suchen mit: 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

Wahrscheinlich verwenden Sie nicht den richtigen Ansatz, aber zuerst beantworte ich die Frage wie gefragt.

auf das erste Spiel finden Sie dies tun können:

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

Beachten Sie, dass dies das erste Spiel ist. Theoretisch ist es möglich, mehrere Einträge mit demselben Hash zu haben, aber das OP hat gesagt, dass die Hashes voraussichtlich einzigartig sind. Aber warum sollten Sie sie nicht als Schlüssel verwenden? Dies macht es einfach, nach ihnen zu suchen:

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"] 
Verwandte Themen