繁体   English   中英

就地Python字典逆

[英]In-place Python dictionary inverse

我想看看是否有可能解决的任务是,通过就地计算交换字典的键,值对(在Python中), 而无需额外的数据结构 (仅恒定数量的额外变量)。 在有限的世界中,这似乎不太可能,但是我很乐意听到有关解决它的建议。

我已经看到了一些有关python中就地字典逆的文章,并且我发现所有解决方案之间都有一个共同之处。 以下字典将无法正确逆转:

dict = {'b':'a','a':'c','c':123}

这样做的原因是,交换第一个参数时,我们会覆盖'a'的实际值(值是唯一的,键是唯一的,但这并不意味着不存在与a相同的值已经存在的密钥)

笔记:

1)作为示例给出的字典具有可哈希值。

2)键/值可以是任何数据类型。 不一定是字符串。

我很想听听解决它的方法,我想过一种方法,但是它只有在我们拥有无限内存的情况下才有效,这显然是不正确的。

编辑:

1)我的想法是,更改字典,以便在每个键条目的开头添加恒定数量的下划线(_)。 下划线的数量取决于按键,如果某个按键具有X下划线,我将添加X + 1下划线(max_underscores_of_key_in_prefix + 1)。 为了解决键中的对象,我将为此创建一个包装器类。 我已经尽力解释了我的直觉,但是我不确定这是否可行。

2)@Mark Ransom的解决方案可以完美地工作,但是如果有人对问题有其他算法解决方案,我仍然很乐意听到! 我将此问题标记为已解决,因为它已解决,但是同样,其他解决方案也非常受欢迎:-)

显然,要做到这一点,键和值都必须是可哈希的。 这意味着您的任何键或值都不能是list 我们可以利用它来知道哪些字典元素已经被处理。

由于您不能同时迭代和修改字典,因此每次交换键/值时都必须重新开始。 这使它非常缓慢,需要执行O(n ^ 2)操作。

def invert_dict(d):
    done = False
    while not done:
        done = True
        for key, val in d.items():
            if isinstance(val, list):
                if len(val) > 1:
                    d[key] = [val[1]]
                    val = val[0]
            else:
                del d[key]
            if not isinstance(val, list):
                if val in d:
                    d[val] = [d[val], key]
                else:
                    d[val] = [key]
                done = False
                break
    for key, val in d.items():
        d[key] = val[0]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM