Python反向词典

Python反向词典,python,dictionary,Python,Dictionary,我目前正在编写一个函数,它接受一个具有不可变值的字典并返回一个反向字典。到目前为止,我的代码得到了非常简单的测试,但仍有一些问题需要解决 def dict_invert(d): inv_map = {v: k for k, v in d.items()} return inv_map list1 = [1,2,3,4,5,6,7,8] list2 = {[1]:3245,[2]:4356,[3]:6578} d = {['a']:[],['

我目前正在编写一个函数,它接受一个具有不可变值的字典并返回一个反向字典。到目前为止,我的代码得到了非常简单的测试,但仍有一些问题需要解决

def dict_invert(d):

     inv_map = {v: k for k, v in d.items()}

     return inv_map

     list1 = [1,2,3,4,5,6,7,8]
     list2 = {[1]:3245,[2]:4356,[3]:6578}
     d = {['a']:[],['b']:[]}
     d['a'].append(list1)
     d['b'].append(list2)
如何修复代码,使其通过测试用例


我唯一的想法是把清单2改成
[1:32,2:43,3:54,4:65]
;但是,如果将
“[]”
放在正确的位置,我仍然会遇到问题。我不知道该怎么做。

诀窍是认识到多个键可以具有相同的值,因此在反转时,必须确保值映射到键列表

from collections import defaultdict

def dict_invert(d):
  inv_map = defaultdict(list)
  for k, v in d.items():
    inv_map[v].append(k)
  return inv_map
编辑:

只是添加了一些更有用的信息

当通过
[]
get
访问时,
defaultdict(list)
会生成dict=
list()
的默认值(正常情况下,它会分别引发
KeyError
或返回
None

有了defaultdict,您可以使用一点逻辑将密钥分组在一起。。。下面是一个例子来说明(来自我上面的评论)

原文:K0->V0,K1->V0,K2->V0

应反转为:V0->[K0,K1,K2]

编辑2:

你的测试似乎迫使你使用正常的口述,在这种情况下

def dict_invert(d):
    inv_map = {}
    for k, v in d.items():
        if v not in inv_map: 
            inv_map[v] = []
        inv_map[v].append(k)
     return inv_map

诀窍是认识到多个关键点可以具有相同的值,因此在反转时,必须确保值映射到关键点列表

from collections import defaultdict

def dict_invert(d):
  inv_map = defaultdict(list)
  for k, v in d.items():
    inv_map[v].append(k)
  return inv_map
编辑:

只是添加了一些更有用的信息

当通过
[]
get
访问时,
defaultdict(list)
会生成dict=
list()
的默认值(正常情况下,它会分别引发
KeyError
或返回
None

有了defaultdict,您可以使用一点逻辑将密钥分组在一起。。。下面是一个例子来说明(来自我上面的评论)

原文:K0->V0,K1->V0,K2->V0

应反转为:V0->[K0,K1,K2]

编辑2:

你的测试似乎迫使你使用正常的口述,在这种情况下

def dict_invert(d):
    inv_map = {}
    for k, v in d.items():
        if v not in inv_map: 
            inv_map[v] = []
        inv_map[v].append(k)
     return inv_map

在return语句之后的所有内容是什么呢?你们那个奇怪的名字
list2
d
甚至不应该运行:列表是不可散列的,所以你们不能将它们用作字典键。@DSM——这也是我的第一个想法,但若它们真的在return语句之后,那个么它们就不会运行了(这或许可以解释为什么有些测试通过了?)使用
collections.defaultdict
@mgilson你们明白了!在返回语句之后所有的东西是怎么回事?你们奇怪的名字
list2
和你们的
d
甚至不应该运行:列表是不可散列的,所以你们不能用它们作为字典键。@DSM——这也是我的第一个想法,但若它们真的是在返回语句后面的话t、 然后他们不运行(这可能解释为什么一些测试通过了?)使用
集合。defaultdict
@mgilson你明白了!现在它为每个测试都输出defaultdict(,{})。知道它为什么这样做吗?我需要添加dict.get吗?现在它输出defaultdict(,{})每次测试。知道它为什么这样做吗?我需要添加dict.get吗?