在 Python 中搜索字典 2

Searching a dictionary in Python 2

我在 python 中创建了一个字典,这是其中的一些示例代码。

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 和 return 我的文件路径对于每个哈希。

还有程序的工作方式,我的列表中永远不会有不在字典中的 MD5,所以不用担心错误检查。

请随时询问我的信息

谢谢。

反转字典,使键为散列,因为您要使用散列进行搜索。

然后只需在字典中搜索关键字: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 ) )

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

>>> 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(根据你的问题,我假设你不希望列表中出现任何不存在的哈希值)。

可能你没有使用正确的方法,但首先我会按要求回答问题。

要找到第一个匹配项,您可以这样做:

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