python中的反字典

2024-06-25 05:57:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这本字典

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

我希望反字典是

^{pr2}$

我已经得到了反函数,但它看起来不像第二个字典

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

Tags: keyinfor字典valuemoviedictchan
3条回答
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

你的代码有两个问题

您遇到的第一个问题是:

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

当你写movie_dict[actor] = (key)时,你不是在创建元组——括号只是为了优先。要创建元组,必须在末尾添加逗号:

^{pr2}$

不管怎样,这不会起到很好的效果,因为元组是不可变的。您应该使用列表:

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

您可以使用^{}轻松完成此操作:

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

相关问题 更多 >