我有工作代码来执行嵌套字典查找,并使用numpy的非零查找函数的结果将另一个查找的结果附加到每个键的列表中。基本上,我需要一个附加到字典的字符串列表。这些字符串和字典的键在一个点处被整数散列为整数,并使用单独的字典跟踪整数散列作为键,字符串作为值。我需要查找这些散列值并将字符串结果存储在字典中。令人困惑,所以希望看代码有所帮助。这是代码的简化版本:
for key in ResultDictionary:
ResultDictionary[key] = []
true_indices = np.nonzero(numpy_array_of_booleans)
for idx in range(0, len(true_indices[0])):
ResultDictionary.get(HashDictA.get(true_indices[0][idx])).append(HashDictB.get(true_indices[1][idx]))
此代码适用于我,但我希望有一种提高效率的方法。我不确定我是否因为嵌套查找而受到限制。速度还取决于非零函数返回的真实结果的数量。有什么想法吗?感谢任何建议。
答案 0 :(得分:0)
您无法对字典查找做很多事情 - 您必须一次完成这些操作。
您可以稍微清理数组索引:
idxes = np.argwhere(numpy_array_of_booleans)
for i,j in idxes:
ResultDictionary.get(HashDictA.get(i)).append(HashDictB.get(j)
argwhere
是transpose(nonzero(...))
,将数组的元组转换为(n,2)索引对数组。我不认为这会对速度产生影响,但代码更清晰。
答案 1 :(得分:0)
以下是两条建议:
1)因为你的哈希值是用int来键入的,所以如果这是一个选项,它可能有助于将它们转换为数组甚至列表以便更快地查找。
k, v = map(list, (HashDictB.keys(), HashDictB.values())
mxk, mxv = max(k), max(v, key=len)
lookupB = np.empty((mxk+1,), dtype=f'U{mxv}')
lookupB[k] = v
2)您可以通过处理ResultDictionary
行来保存HashDictA
和numpy_array_of_booleans
中的大量查询:
i, j = np.where(numpy_array_of_indices)
bnds, = np.where(np.r_[True, i[:-1] != i[1:], True])
ResultDict = {HashDictA[i[l]]: [HashDictB[jj] for jj in j[l:r]] for l, r in zip(bnds[:-1], bnds[1:])}
2b)如果由于某种原因你需要逐步添加关联,你可以做一些事情(我会缩短变量名称)
from operator import itemgetter
res = {}
def add_batch(data, res, hA, hB):
i, j = np.where(data)
bnds, = np.where(np.r_[True, i[:-1] != i[1:], True])
for l, r in zip(bnds[:-1], bnds[1:]):
if l+1 == r:
res.setdefault(hA[i[l]], set()).add(hB[j[l]])
else:
res.setdefault(hA[i[l]], set()).update(itemgetter(*j[l:r])(hB))