python - 避免循环并提高性能以更新字典

标签 python python-3.x

我有一个形式的字典:

dict1[element1] : reference1

dict1[element2] : reference2

dict1[element3] : reference2

有些元素具有相同的引用(如 element2element3 有)。 我需要将其转换为具有以下形式的字典:

dict2[reference1] : [element1]

dict2[reference2] : [element2,element3]

为了得到这个我写了:

dict2=dict()
for key in dict1:
    UpdateDict(dict2,dict1[key],key)

def UpdateDict(Dict,Key,Entry):
    Keys = list(Dict.keys())
    if Key in Keys:
        Dict[Key].append(Entry)
        return
    else:
        Item = list()
        Item.append(Entry)
        Dict[Key] = Item
    return

这在 dict1 不是很大之前工作正常,但如果 dict1 很大(大约 1000 个键),则需要数小时才能获得结果。

有没有更快的方法?

最佳答案

这个:

Keys = list(Dict.keys())
if Key in Keys:
    ...

可能是罪魁祸首。它将 O(1) 查找(if Key in Dict:)转换为 O(n) 查找。这加上每个键的单函数调用的开销确实是次优的。

一个更简单的解决方案是使用 collections.defaultdict:

from collections import defaultdict

def revindex(dic):
    rev = defaultdict(list)
    # nb for py2.7 use `iteritems()` instead
    for k, v in dic.items():
        rev[v].append(k)
    return rev


dict2 = revindex(dict1)

关于python - 避免循环并提高性能以更新字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48686127/

相关文章:

python - 当多个参数包含空格时如何使用子进程?

python - 获取通过 os.system() 命令执行的命令的输出

Python ctypes,将 c_void_p 作为输出参数传递给 c 函数

python - scipy.interpolate.interp2d 的问题 - s 或 m 太小 - 无法添加更多结

python - 在 groupby 内循环并更改每个组的第一行

python - 从网站生成的单元测试 pdf

python - 使用 cv2.putText() 将文本放置在循环之外

python - 如何使用 Anaconda 的 Python 版本执行 Python 脚本?

python - 创建列表列表。修改列表中的元素

python-3.x - 为什么gzip不一致?