避免循环并提高性能以更新di

2024-04-20 08:41:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张表格:

dict1[element1] : reference1

dict1[element2] : reference2

dict1[element3] : reference2

有些元素有相同的引用(比如element2element3有)。 我需要把它转换成如下形式的dict:

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个键),则需要几个小时才能得到结果。你知道吗

有没有更快的方法?你知道吗


Tags: keyinitemdictentrydict1element2dict2
3条回答

您可以使用defaultdictdict.setdefault

dict2 = {}
for key, value in dict1.items():
    dict2.setdefault(value, []).append(key)

对于这样一个简单的调用,函数似乎是不必要的。你知道吗

使用^{}而不是普通的dict来避免这些成员身份检查,您可以删除函数调用,这会增加重复调用的不小开销:

from collections import defaultdict

dct2 = defaultdict(list)
for k in dct1:
   dct2[dct1[k]].append(k)

这是:

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)

相关问题 更多 >