在字典中交换键值对

时间:2015-07-13 10:28:01

标签: python python-3.x dictionary swap space-complexity

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

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

前:

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

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

3 个答案:

答案 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
相关问题