python - Python 中的就地字典反转

标签 python list hashtable 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

原始是列表字典,结果是列表字典。这会“反转”它。

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

print invert(test)

这给出:

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

我需要知道这是否可以就地完成,因为我目前的策略是超过我正在使用的字典在我机器上的物理内存量。你能想出一种方法来使用生成器吗?

最佳答案

这不是原地做,而是使用 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

我有一种感觉,除非大小增加,否则 dict 永远不会调整大小,因此您可能需要定期添加和删除虚拟项。参见 Shrinkage rate

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

关于python - Python 中的就地字典反转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3418189/

相关文章:

python - 在 Python 中连接字符串的最有效方法

python - 如何在 Python 中以简洁的方式将字典中的某些值转换为列表?

c# - 为什么 Enumerator.MoveNext 在与 using 和 async-await 一起使用时不能像我预期的那样工作?

c++ - 如何使用整数数组作为 unordered_map 的键

java - 为什么我的 get 方法没有将分配的值返回给我的键?

python - 实现 alpha-beta 修剪算法时函数中的奇怪行为

python - 不在 Flask 中散列密码

python - Hashicorp 金库 : Python hvac does not see secrets

python - 如何在列表中找到相同的值并将新列表组合在一起?

scheme - 如何映射哈希表的值( Racket )