2017-03-21 82 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

你有一个路径 - >哈希映射,但你需要一个哈希 - >路径映射。假设哈希值是唯一的,扭转字典

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