2017-03-21 2 views
1

파이썬으로 사전을 만들었습니다.이 샘플 코드는 약간의 코드입니다.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

당신은 경로가 -> 해시 매핑을하지만 해시 필요 -> 경로 매핑을. 해시가 고유 한 가정 일치

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

지금 당신의 목록과 보고서를 반복 사전 역 :

>>> hashes = ['456'] 
>>> for hash in hashes: 
...  filename = hashesAndFiles[hash] 
...  print(filename) 
... 
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"]