But for this I would have to use extra space for declaring another dictionary.
由于字典本质上是一个查找表,因此它有一种在内存中布局的具体方式;密钥有效地分配,只是指向值 – 它们本身没有特殊含义.因此,当您想要反转映射时,您无法真正使用现有结构;相反,您将不得不从头开始创建新的字典条目.您在问题中使用的词典理解是一种很好的,明确的方法.
然而,您可以重复使用已有的字典并在那里添加新密钥(同时删除旧密钥):
for k in a:
a[a[k]] = k
del a[k]
这会修改相同的字典,因此它不会有新字典的(可能很少)开销.请注意,这假设所有值都是唯一的,因此映射可以完全颠倒,并且键和值集不共享公共值.否则,您将遇到字典大小更改的异常或缺少值.你可以通过创建字典键的副本来避免前者(虽然这意味着你现在也有一个列表存储):
for k in list(a):
if a[k] != k:
a[a[k]] = k
del a[k]
最后一点:可能多次修改字典可能会有一些重映射副作用(增加散列表大小等),但这可能是CPython的实现细节(我对此不太了解) ).