Python中的就地字典反转

Nat*_*han 4 python hashtable list generator

我需要反转一个列表字典,我不知道如何用英语解释它,所以这里有一些代码可以做我想要的.它只需要太多的记忆.

def invert(oldDict):
    invertedDict = {}
    for key,valuelist in oldDict.iteritems():
        for value in valuelist:
            try:
                entry = invertedDict[value]
                if key not in entry:
                    entry.append(key)
            except KeyError:
                invertedDict[value] = [key]
    return invertedDict
Run Code Online (Sandbox Code Playgroud)

原文是列表的字典,结果是列表的字典.这"颠倒"它.

test = {}
test[1] = [1999,2000,2001]
test[2] = [440,441]
test[3] = [440,2000]

print invert(test)
Run Code Online (Sandbox Code Playgroud)

这给出了:

{2000: [1, 3], 2001: [1], 440: [2, 3], 441: [2], 1999: [1]}
Run Code Online (Sandbox Code Playgroud)

我需要知道这是否可以就地完成,因为我当前的策略是使用我正在使用的字典超过了我机器上的物理内存量.你能想到用发电机做这个的方法吗?

Joh*_*ooy 5

这不适用,但使用popitem()消耗oldDict

from collections import defaultdict
def invert(oldDict):
    invertedDict = defaultdict(list)
    while oldDict:
        key, valuelist = oldDict.popitem()
        for value in valuelist:
            invertedDict[value].append(key)
    return invertedDict
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,除非尺寸增加,否则dict的尺寸永远不会调整,因此您可能需要定期添加+删除虚拟物品.请参阅收缩率

from collections import defaultdict
def invert(oldDict):
    invertedDict = defaultdict(list)
    i=0
    while oldDict:
        key, valuelist = oldDict.popitem()
        for value in valuelist:
            invertedDict[value].append(key)
        i+=1
        if i%1000==0: # allow the dict to release memory from time to time
            oldDict[None]=None
            del oldDict[None]
    return invertedDict
Run Code Online (Sandbox Code Playgroud)