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)
但为此,我将不得不使用额外的空间来声明另一个字典.
我想知道可以使用的方法来交换键值对更多的空间效率.
\n\n\n但为此我必须使用额外的空间来声明另一个字典。
\n
由于字典本质上是一个查找表,因此它在内存中的布局有一种具体的方式;键被有效地分配并且仅指向\xe2\x80\x94本身\xe2\x80\x94没有特殊含义的值。因此,当你想要反转映射时,你可以\xe2\x80\x99t真正使用现有的结构;相反,您将必须从头开始创建新的字典条目。您在问题中使用的字典理解是一种很好且清晰的方法。
\n\n但是,您可以做的是重用已有的字典并在其中添加新键(同时删除旧键):
\n\nfor k in a:\n a[a[k]] = k\n del a[k]\nRun Code Online (Sandbox Code Playgroud)\n\n这会修改相同的字典,因此它不会\xe2\x80\x99t具有新字典的(可能很少)开销。请注意,这假设所有值也是唯一的,因此映射可以完全反转,并且键和值集不共享公共值。否则,您将遇到字典大小更改的异常或缺失值。您可以通过创建字典键的副本来避免前者(尽管这意味着您现在也有一个要存储的列表):
\n\nfor k in list(a):\n if a[k] != k:\n a[a[k]] = k\n del a[k]\nRun Code Online (Sandbox Code Playgroud)\n\n最后一点:\xe2\x80\x99s 可能会多次修改字典,这样可能会产生一些重新映射的副作用(增加哈希表大小等),但是 \xe2\x80\x99s 可能的实现细节CPython(我\xe2\x80\x99m对此不太确定)。
\n| 归档时间: |
|
| 查看次数: |
7257 次 |
| 最近记录: |