在Python中反转字典
我有一个字典
{'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