交换字典中的键值对

Swapping key-value pairs in a dictionary

我正在寻找交换给定字典的所有键值对的方法。

到目前为止我能想到一种方法:

例如:

>>>a = { 0: 'a', 1 : 'b', 2 : 'c' }
>>> {value : key for key,value in a.items()}
{'a': 0, 'b': 1, 'c' : 2}

但是为此我必须使用额外的 space 来声明另一个字典。
我想知道我可以使用哪些方法来更有效地交换键值对 space-efficiency.

But for this I would have to use extra space for declaring another dictionary.

由于字典本质上是一种查找table,所以它在内存中有一种具体的布局方式;键被有效地分配并且只指向值本身没有特殊意义。这样,当你想反转映射时,你不能真正使用现有的结构;相反,您将不得不从头开始创建新的字典条目。您在问题中使用的字典理解是一种很好且清晰的方法。

然而,您可以做的是重用您已有的字典并在其中添加新键(同时删除旧键):

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]

最后一点:像这样多次修改字典可能会产生一些重新映射的副作用(增加散列 table 大小等),但这是 CPython 的可能实现细节(我不太确定)。

试试这个代码。它在反转键和值之前删除字典中的项目。

for k, v in a.items():
  del a[k]
  a[v] = k

为了避免@DSM 在@poke 的回答中指出的覆盖特殊情况,我建议始终使用第二个字典。性能相同。

b = dict()
for k, v in a.items(): # a.iteritems() in python 2
    b[v] = k
    del a[k]
a = b