1

所以我有一个问题。

我想做与此类似的事情,我在其中调用一个值,并打印出与该值关联的键。我什至可以让它工作:

def test(pet): 
  dic = {'Dog': ['der Hund', 'der Katze'] , 'Cat' : ['der Katze'] , 'Bird': ['der Vogel']}
  items = dic.items()
  key = dic.keys()
  values = dic.values()
  for x, y in items:
      for item in y: 
          if item == pet:
              print x

但是,当我将这种相同的代码格式合并到一个更大的程序中时,它会停止工作:

def movie(movie):
  file = open('/Users/Danrex/Desktop/Text.txt' , 'rt')
  read = file.read()
  list = read.split('\n')

  actorList=[]
  for item in list:
  actorList = actorList + [item.split(',')]

  actorDict = dict()
  for item in actorList:
    if item[0] in actorDict:
      actorDict[item[0]].append(item[1])
    else:
      actorDict[item[0]] = [item[1]]

  items = actorDict.items()
  for x, y in items:
      for item in y: 
          if item == movie:
              print x

我已经打印(编辑)了 actorDict、items、x、y 和 item,它们似乎都遵循与前面的代码相同的格式,所以我不知道为什么这不起作用!如此迷茫。而且,拜托,当你向我解释它时,就好像我是一个彻头彻尾的白痴一样,我可能是。

4

1 回答 1

0

使用一些更惯用的 Python 清理代码有时会澄清一些事情。这就是我在 Python 2.7 中的编写方式:

from collections import defaultdict

def movie(movie):
    actorDict = defaultdict(list)
    movie_info_filename = '/Users/Danrex/Desktop/Text.txt'
    with open(movie_info_filename, 'rt') as fin:
        for line_item in fin:
            split_items = line_item.split(',')
            actorDict[split_items[0]].append(split_items[1])

    for actor, actor_info in actorDict.items():
        for info_item in actor_info: 
            if info_item == movie:
                print actor

在这种情况下,主要是为制作actorDict. defaultdict创建一个类似字典的对象,允许指定一个函数来为当前不存在的键生成默认值。有关更多信息,请参阅集合文档

看起来您正在尝试做的是每次在文本文件中与特定电影一起列出时打印出一些演员值。

如果您要检查不止一部电影,请制作actorDict 一次并将您的电影与现有的actorDict. 这将节省您访问磁盘的次数。

from collections import defaultdict

def make_actor_dict():
    actorDict = defaultdict(list)
    movie_info_filename = '/Users/Danrex/Desktop/Text.txt'
    with open(movie_info_filename, 'rt') as fin:
        for line_item in fin:
            split_items = line_item.split(',')
            actorDict[split_items[0]].append(split_items[1])

def movie(movie, actorDict):
    for actor, actor_info in actorDict.items():
        for info_item in actor_info: 
            if info_item == movie:
                print actor

def main():
    actorDict = make_actor_dict()
    movie('Star Wars', actorDict)
    movie('Indiana Jones', actorDict)

如果您只关心该演员是否在那部电影中,则不必手动遍历电影列表,您只需检查它movieactor_info

def movie(movie, actorDict):
    for actor in actorDict:
        if movie in actorDict[actor]:
            print actor

当然,您已经发现问题在于电影名称与您从文件中读取的文本不完全匹配。如果您想允许不完全匹配,您应该考虑规范化您的电影字符串和文件中的数据字符串。字符串方法在strip()那里lower()非常有用。

于 2013-06-12T18:21:53.320 回答