我有这本字典
{'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发布于 2011-11-24 02:18:00
您可以使用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发布于 2011-11-24 01:43:52
您的代码有两个问题
您遇到的第一个问题位于以下几行:
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发布于 2011-11-24 01:31:53
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_dicthttps://stackoverflow.com/questions/8246484
复制相似问题