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 に答える