在字典中交换键值对

Ksh*_*ogi 6 python swap dictionary space-complexity python-3.x

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

到目前为止,我可以想到一种方法:

例如:

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

但为此,我将不得不使用额外的空间来声明另一个字典.
我想知道可以使用的方法来交换键值对更多的空间效率.

pok*_*oke 3

\n

但为此我必须使用额外的空间来声明另一个字典。

\n
\n\n

由于字典本质上是一个查找表,因此它在内存中的布局有一种具体的方式;键被有效地分配并且仅指向\xe2\x80\x94本身\xe2\x80\x94没有特殊含义的值。因此,当你想要反转映射时,你可以\xe2\x80\x99t真正使用现有的结构;相反,您将必须从头开始创建新的字典条目。您在问题中使用的字典理解是一种很好且清晰的方法。

\n\n

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

\n\n
for k in a:\n    a[a[k]] = k\n    del a[k]\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会修改相同的字典,因此它不会\xe2\x80\x99t具有新字典的(可能很少)开销。请注意,这假设所有值也是唯一的,因此映射可以完全反转,并且键和值集不共享公共值。否则,您将遇到字典大小更改的异常或缺失值。您可以通过创建字典键的副本来避免前者(尽管这意味着您现在也有一个要存储的列表):

\n\n
for k in list(a):\n    if a[k] != k:\n        a[a[k]] = k\n        del a[k]\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后一点:\xe2\x80\x99s 可能会多次修改字典,这样可能会产生一些重新映射的副作用(增加哈希表大小等),但是 \xe2\x80\x99s 可能的实现细节CPython(我\xe2\x80\x99m对此不太确定)。

\n