我正在寻找交换给定字典的所有键值对的方法。
到目前为止,我可以想到一种方法:
前:
>>>a = { 0: 'a', 1 : 'b', 2 : 'c' }
>>> {value : key for key,value in a.items()}
{'a': 0, 'b': 1, 'c' : 2}
但为此,我将不得不使用额外的空间来宣布另一个字典 我想知道可以使用的方法来交换键值对更多的空间效率。
答案 0 :(得分:3)
但为此,我将不得不使用额外的空间来声明另一个字典。
由于字典本质上是一个查找表,因此在内存中有一种具体的方式;密钥有效地分配,只是指向值 - 它们本身没有特殊含义。因此,当您想要反转映射时,您无法真正使用现有结构;相反,您将不得不从头开始创建新的字典条目。你在问题中使用的词典理解是一种很好而且清晰的方法。
你可以做的是重复使用你已经拥有的字典并在那里添加新密钥(同时删除旧密钥):
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的实现细节(我也不是肯定的。)
答案 1 :(得分:0)
试试这段代码。它会在反转键和值之前删除字典中的项目。
for k, v in a.items():
del a[k]
a[v] = k
答案 2 :(得分:0)
为了避免@dsM在@ poke的答案中指出的覆盖特殊情况,我建议总是使用第二个字典。表现相同。
b = dict()
for k, v in a.items(): # a.iteritems() in python 2
b[v] = k
del a[k]
a = b