首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中的倒排字典

python中的倒排字典
EN

Stack Overflow用户
提问于 2011-11-24 01:26:01
回答 8查看 905关注 0票数 5

我有这本字典

代码语言:javascript
复制
{'jackie chan': ('rush hour', 'rush hour 2'), 
 'crish tucker': ('rush hour', 'rush    hour 2')}

我希望倒排字典是

代码语言:javascript
复制
{'rush hour': ('jackie chan', 'crish tucker'), 
 'rush hour 2': ('jackie chan', 'crish tucker')}

我已经得到了要求逆的函数,但它看起来不像第二本字典

代码语言:javascript
复制
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
EN

回答 8

Stack Overflow用户

发布于 2011-11-24 02:18:00

您可以使用collections.defaultdict轻松实现这一点

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2011-11-24 01:43:52

您的代码有两个问题

您遇到的第一个问题位于以下几行:

代码语言:javascript
复制
if actor in movie_dict:
    movie_dict[actor].append(key)
else:
    movie_dict[actor] = (key)

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

代码语言:javascript
复制
 movie_dict[actor] = (key,)

无论如何,这并不能很好地工作,因为元组是不可变的。您应该使用列表:

代码语言:javascript
复制
if actor in movie_dict:
    movie_dict[actor].append(key)
else:
    movie_dict[actor] = [key] # Square brackets

或者创建新的元组:

代码语言:javascript
复制
if actor in movie_dict:
    movie_dict[actor] = movie_dict[actor] + (key,)
else:
    movie_dict[actor] = (key,)

我强烈建议您使用第一个选项。如果您确实需要使用元组,请在处理后将列表转换为元组。

的第二个问题是您似乎期望的

代码语言:javascript
复制
'rush hour 2'

等于

代码语言:javascript
复制
'rush    hour 2'

如字典中所示:

代码语言:javascript
复制
{'jackie chan': 
    ('rush hour', 'rush hour 2'), 
 'crish tucker': 
    ('rush hour', 'rush    hour 2')}

但事实并非如此:

代码语言:javascript
复制
>>> 'rush hour 2' == 'rush    hour 2'
False

你怎么解决这个问题呢?嗯,我设计的最简单的解决方案是在空格处拆分字符串,然后只用一个空格重新连接它:

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2011-11-24 01:31:53

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8246484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档