[英]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.