2016-04-04 9 views
-1

からタプルの辞書を作成します。私はこのように書きファイルを持っているファイル

0B

私はこのような辞書にしたい:

{'リムリック':([8,5]、['A'、B '])、'クインタイン(英語) ':([0 、0]、[ 'A'、 'B'])}

これまでのところ、私が得ることができました:

{ 'リムリック':[]、 'ロンドー':[] ' []、[クインタイン(英語)]:[]、[ソネット]:[]}

しかし、その後私は8 A、5 Bなどを追加する方法はわかりません。彼らがどこから始まったのか停止するのですが、PythonのIOがそうすることはできません。

仮に私は8 A、5 Bをリストに追加しようとしていましたが、8,5、A、Bを2つのリストに追加してから並べ替えようとしていました。しかし、それは不可能/非常に効果的ではないようです。

私の試み(poem_formは私が得ることができたものです):

def read_poetry_form_descriptions(poetry_forms_file): 

    poem_file = open(poetry_forms_file, 'r') 
    temp_poem, poem_form = {}, {} 

    for line in poem_file: 
     temp_poem[line.strip()] =() 
     poem_form.pop('', None) 

    poem_file.close() 

    for key in temp_poem: 
     if key[0:3].isalpha(): 
      poem_form[key] = [] 

    print(poem_form) 
+1

あなたはどのようにあなたのバージョンを手に入れましたか?エラーが見つかるようにコードを投稿してください。 – Selcuk

+0

@Selcuk投稿したコード。 –

+0

あなたが試みることができるのは、 '.isaplha()'と同じように、 '.isdigit()'を使って数字をリストに入れることができます。 –

答えて

2

ここでは、あなたの問題に対する可能な解決策です。

def read_poetry_from_desc(poetry_forms_file): 
    poem_form = {} 

    with open(poetry_forms_file, 'r') as f: 
     cur_header = None # latest header found in file 

     for line in f: 
      line = line.strip() 

      # Skip empty lines 
      if len(line) == 0: 
       continue 

      if line[0].isalpha(): 
       # Found new header, add empty entry to dict 
       cur_header = line 
       poem_form[cur_header] = ([], []) 

      else: 
       # Found data, record it 
       pair = line.split() # split on space 

       data = poem_form[cur_header]     
       data[0].append(int(pair[0])) 
       data[1].append(pair[1]) 

    return poem_form 

EDIT:
アイデアは、あなたが情報を知っているあなたは辞書を移入です。ファイルのレイアウトはラベルで、後続のデータは別のラベルが見つかるまでそのラベルに属しています。

これは、データが取ることができるフォームが非常に限られているので、より効率的にすることもできます。アルファベット文字または数値で始まるデータで構成されたラベルです。したがって、行がアルファベット文字で始まるかどうかを見ることで、2つを区別することができます。

poem_formの各キーの値は([], [])の形式であるため、ファイルに新しいラベルが表示されたときに空のリストが辞書に追加されます。また、その特定のラベル(cur_header)について現在蓄積中であることを記録しています。

データが表示されるたびに、現在のラベル(cur_label)に関係なく、データが分割されて蓄積されます。

withについては、linkを参照してください。それは私ができるよりもそれを説明するより良い仕事をすることができます。基本的に、withは、使用開始時と終了時に操作が行われたテキストブロックがある場合に使用されます。ここではそれをopenに使用します。通常、ファイルを開いて、完了したらファイルを閉じる必要があります。この機能では、withスコープが終了すると、ファイルは自動的に閉じられます。それが起こる理由を理解するには、リンクされた記事を参照してください。

+0

驚くべき聖なる地獄、魅力のように働く。以前と同じように&とは見たことがないので、私はこれの背後に論理的根拠を得ることができます。 –

+0

これは、割り当てであったかもしれない質問に文脈なしに与えられた答えです。人々はどのように学ばなければなりませんか?教師としてあなたはよく知っているべきです。 –

+1

@FerdinandvanWykあなたは正しいですか?私はOPにお詫び申し上げます。 – sdsmith

関連する問題