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