Python 字典互换 Key 和 Value

这种场景应该比较特殊。

一、原字典的 Value 无重复

这种比较简单。假设我们有一个叫 d 的字典:

[code lang=”python”]
d = {
‘a’: ‘x’,
‘b’: ‘y’,
‘c’: ‘z’
}
[/code]

需要将其转换成:

[code lang=”python”]
p = {
‘x’: ‘a’,
‘y’: ‘b’,
‘z’: ‘c’
}
[/code]

只需要进行如下操作:

[code lang=”python”]
p = {}
for k, v in d.items():
p.setdefault(v, k)
[/code]

或者简单写成:

[code lang=”python”]
p = dict((k, v) for v, k in d.items())
[/code]

二、原字典的 Value 有重复

假设我们有一个叫 d 的字典:

[code lang=”python”]
d = {
‘狗’: ‘动物’,
‘猫’: ‘动物’,
‘水稻’: ‘植物’,
‘荷花’: ‘植物’,
‘牛’: ‘动物’
}
[/code]

需要将其转换成:

[code lang=”python”]
p = {
‘动物’: [‘狗’, ‘猫’, ‘牛’],
‘植物’: [‘水稻’, ‘荷花’]
}
[/code]

可以使用如下方法:

[code lang=”python”]
p = {}
for k, v in d.items():
p.setdefault(v, []).append(k)
[/code]

这样 p 就成了我们想要的样子。原理在于 dictionary 的 setdefault 方法:

setdefault(key[, default])
If key is in the dictionary, return its value. If not, insert key with a value of default and return default. default defaults to None.

  1. 当第一次循环时,setdefault(v, []) 方法为 p 字典创建了一个 key ,因为之前这个 key 不存在,且我们设置了值为 [] ,所以他的值为一个空的 list;然后我们用 list 的 append() 方法将 k 追加进 list 中。
  2. 在后续的循环中,如果循环到的 v 已经是 p 字典的 key 之一,setdefault() 方法则会忽略我们提供的第二个参数,直接返回 v 对应的值,我们再次进行了 list.append() 操作。

发表评论

电子邮件地址不会被公开。 必填项已用*标注