2017-11-11 16 views
1

は私がして、たとえばアクセスできる複数の辞書を含む大きなリストを持って一覧表示しますTI ']、[' AB ']、[' MH '])、それらを.txtファイルに出力しますが、現時点では私のコードはすべてのキー([' TI '])辞書。これは私が持っているものです。追加、複数の辞書要素が

papers = [] # the list of dictionaries 

for each in range(0, len(papers)): 
    out = [] 
    try: 
     out.append(str(papers[each]['TI']) + "\n" + str(papers[each]['AB']) + "\n" + str(papers[each]['MH']) + "\n") 
    except KeyError: 
     out.append("MISSING INFORMATION \n") 

for index, line in enumerate(out): 
    with open(filename+'_{}.txt'.format(index), 'w') as output: 
     output.write(line) 

注:

TypeError: cannot concatenate 'str' and 'list' objects 

私はできませんので、間違っている可能性が何を:私はこのエラーを取得保管ので、私は、各論文キーに)(STRを追加しました3つの異なるキーを1つだけ印刷しますか?どんな助けもありがとう。

+0

あなたが値を印刷することができますか?おそらくリストを含むエントリがあります(たとえほとんどのエントリに文字列が含まれていても) –

+0

おそらく、最初のものだけでなく、3つのキーを追加することもできます。 output.write(line) 'それは間違っています。(ファイル名+ '_ {} .txt'.format(インデックス)、' w ')を開くと、 が列挙されています: – fernand0

+0

、 'with'と' for'行を入れ替えるか、最後の行だけを書きます –

答えて

1

私はおそらくこのようなものだろう:

papers = [] # the list of dictionaries 
out = [] 
# ... 
# populate your papers list 
# ... 
for paper in papers: 
    try: 
     paper_string = "{TH}\n{AB}\n{MH}\n".format(
      TH=paper['TH'], 
      AB=paper['AB'], 
      MH=paper['MH']) 
    except KeyError: 
     paper_string = "MISSING INFORMATION\n" 
    finally: 
     out.append(paper_string) 
+0

これは仕事をしました。ありがとうございました:) – tanmald

+0

'format'を使ってもstringに変換されます。それは問題を隠し、OPコードと同等です(よりpythonicのように見えます) –

+0

'format'に関する素晴らしい点は、' + = 'が行う中間文字列を作成しないことです。 –

0

は、このコードを試してみてください。

papers=[] 
out = [] 

for index,value in enumerate(papers): 
    try: 
     out.append(str(papers[index]['TH']) + "\n" + str(papers[index]['AB']) + "\n" + str(papers[index]['MH']) + "\n") 
    except KeyError: 
     out.append("MISSING INFORMATION \n") 

    print(out) 
+0

私は最初に 'out' forループの外側で試してみましたが、何の違いもないようです。それ以外のコードは機能しません。複数の "欠落した情報"が表示されるためです。 – tanmald

+0

ループ内の 'out'に値を追加していますが、その現在のループの外に' out'を使用しています。 リストデータのサンプルを与えることができ、私が試したことは、このコードのために働いて、私は、このデータで試してみました: https://dpaste.de/8HTy –

+0

は、あなたが本当に 'index'が必要なのですか?いいえ、あなたドン't。それはOPの問題を解決していますか?:いいえ –

1

問題はあなたの出ている= []のためのループ内であることを。反復ごとに、それは空白のリストに再初期化されます。

いくつかのマイナーな提案:

  1. がちょうど各 以来、

  2. はあなたがそれぞれの[キー]を使用することができ、あなたの文字列のキーを取得するには論文の各(範囲は必要ありません)のために使用しますループが参照している論文の現在のエントリを表します。

あなただけ静かにあなたが不足しているキーを持つ例外を作成していないことを確認するためにIFSを使用して、同様除き/トライせずにそれを行うことができた論文のリストを通過します。ここに私のtestcodeだ:

dict1 = {'TI':'baa', 'AB':'baar', 'MH':'maa', 'DK':'maar'} # all keys and more 
dict2 = {'TI':'baa', 'AB':'baar', 'MH':'maa', 'DK':'maar'} 
dict3 = {'OG':'moo', 'AG':'moor', 'ND':'raa', 'DG':'raar'} # none of the keys 
dict4 = {'TI':'baa', 'AG':'moor', 'MH':'maa', 'DG':'raar'} # Two of the keys 


papers = [dict1, dict2, dict3, dict4] 

out = [] 

for paper in papers: # Automatically iterates over all list entries in papers. 


    # if all papers always have all three keys: 
    ##results = ''.join((paper['TI'], '\n', paper['AB'], '\n', paper['MH'])) 

    ##out.append(results) 

    # OR: If they may have only (any) one of the keys: 

    results = '' 

    if 'TI' in paper: results+=paper['TI'] 
    if 'AB' in paper: results+='\n'+paper['AB'] 
    if 'MH' in paper: results+='\n'+paper['MH'] 

    out.append(results) 

これにより、第2版のためにある:

['baa\nbaar\nmaa', 'baa\nbaar\nmaa', '', 'baa\nmaa']

+0

私は最初にforループの外側を使いましたが、私は結果を見ていなかったのでループ内に移動しましたが、Ayodhyankit Paulが言ったように、私はループの外でその外側を使います。コードの残りの部分については、@ starlingのbaldwinの答えは私のためのトリックでしたが、欠落している情報のヒントは役に立ちます。ありがとうございました :) – tanmald

関連する問題