在Python中反转字典

5 投票
8 回答
1062 浏览
提问于 2025-04-17 06:55

我有一个字典

{'jackie chan': ('rush hour', 'rush hour 2'), 
 'crish tucker': ('rush hour', 'rush    hour 2')}

我想要得到一个反向字典,应该是这样的

{'rush hour': ('jackie chan', 'crish tucker'), 
 'rush hour 2': ('jackie chan', 'crish tucker')}

我已经写了一个可以反向的函数,但得到的结果和第二个字典看起来不一样

def invert_actor_dict(actor_dict):
    movie_dict = {}
    for key,value in actor_dict.iteritems():

        for actor in value:
            if actor in movie_dict:
                movie_dict[actor].append(key)
            else:
                movie_dict[actor] = (key)
    return movie_dict

8 个回答

0

在编程中,有时候我们需要把一些代码放在特定的地方,这样它们才能正常工作。比如说,如果你想让某个功能在特定的条件下运行,你就需要把相关的代码放在那个条件的判断里面。

另外,代码的顺序也很重要。有些代码需要在其他代码之前执行,这样才能确保程序按预期运行。就像做饭一样,先把材料准备好,再开始烹饪,否则可能会出错。

总之,理解代码的结构和顺序是编程的基础,能帮助你写出更有效的程序。

def invert_actor_dict(actor_dict):
   movie_dict = {}
   for actor,movies in actor_dict.iteritems(): 

       for movie in movies:
           if not movie_dict.has(movie):
               movie_dict[movie]=[]
           movie_dict[movie].append(actor)
   return movie_dict
4

你的代码有两个问题

第一个问题出现在这些行:

if actor in movie_dict:
    movie_dict[actor].append(key)
else:
    movie_dict[actor] = (key)

当你写 movie_dict[actor] = (key) 时,其实并没有创建一个元组——括号只是用来改变运算顺序的。要创建一个元组,你需要在最后加一个逗号:

 movie_dict[actor] = (key,)

不过,这样也不行,因为元组是不可变的。你应该使用列表:

if actor in movie_dict:
    movie_dict[actor].append(key)
else:
    movie_dict[actor] = [key] # Square brackets

或者创建新的元组:

if actor in movie_dict:
    movie_dict[actor] = movie_dict[actor] + (key,)
else:
    movie_dict[actor] = (key,)

我强烈建议你使用第一个选项。如果你真的需要使用元组,可以在处理完后再把列表转换成元组。

第二个问题是你似乎期望

'rush hour 2'

等于

'rush    hour 2'

在字典中看到:

{'jackie chan': 
    ('rush hour', 'rush hour 2'), 
 'crish tucker': 
    ('rush hour', 'rush    hour 2')}

但这并不正确:

>>> 'rush hour 2' == 'rush    hour 2'
False

你该如何解决呢?嗯,我想到的最简单的办法是把字符串按空格分开,然后再用一个空格把它们连接起来:

def invert_actor_dict(actor_dict):
    movie_dict = {}
    for key,value in actor_dict.iteritems():
        for actor in value:
            split_movie_name = key.split()
            # 'rush     hour 2'.split() == ['rush', 'hour', '2']
            movie_name = " ".join(split_movie_name)
            # " ".join(['rush', 'hour', '2']) == 'rush hour 2'
            if actor in movie_dict:
                movie_dict[actor].append(movie_name)
            else:
                movie_dict[actor] = [movie_name]
    return movie_dict
5

你可以很简单地使用 collections.defaultdict 来实现这个功能:

def invert_dict(d):
    inverted_dict = collections.defaultdict(set)
    for actor, movies in d.iteritems():
        for movie in movies:
            inverted_dict.add(actor)
    return inverted_dict

撰写回答