2017-08-06 5 views
1

場合、私は2つの私が読みたいファイル、および印刷lines.append()があります。ループでPythonの印刷lines.appendに()これは私の問題です/他

はFile1:

ID1 desc1 
ID2 desc2 
ID3 desc3 
ID4 desc4 

ファイル2:

ID1 random1 
ID5 random5 
ID6 random6 

私は何を取得したいと思いがある:

ID1 random1 desc1 
ID5 random5 desc5 
ID6 randomI nothing 

しかし、私の現在のコード:しかし、私はまた、代わりに

ID1 random1 desc1 
ID5 random5 nothing 
ID6 randomI nothing 
ID1 random1 nothing 
ID5 random5 desc5 
ID6 random6 nothing 

をループを取得しています誰かが提案できるかどう

address = {} 

with open('address.txt', 'r') as f: 
    rows = (line.rstrip().split('\t') for line in f) 
    address = { row[0]:row[1:] for row in rows } 

    for key, value in address.items(): 

     with open('families.txt', 'r') as f:  
      for line in f.readlines(): 
       line = line.rstrip('\n') 
       line = line.split('\t') 
       if line[0] == key: 
        line.append(str(address[key])) 
        print ('\t'.join(line)) 
       else: 
        line.append('nothing') 
        print ('\t'.join(line)) 

、それはいいだろう最終的に私の辞書の '値'の一部として印刷された大括弧を捨てる最良の方法です。

+2

File1 'address.txt'、File2 'families.txt'ですか?あなたの質問はそれをはっきりさせません。そして、あなたはなぜaddress.items()の鍵となる価値を求めているのですか? 'families.txt'の内容をループし、各行のIDを使用して 'address'辞書にあるかどうかをテストします。 –

答えて

0

私は

...不要だったとうまくいけば、いくつかのことをクリーンアップし、いくつかの項目を削除し.rstrip().split()方法は、デフォルトで自動的にそれらの文字を扱うので、私は'\n''\t'への参照を削除しました。

with open('address.txt', 'r') as f: 
    rows = [line.rstrip().split() for line in f] 

Iはxに各行の第一及び第二の項目をアンパックする文と辞書への挿入のためのy値についてにおけるアンパック素子を利用しました。

address = { x: y for x, y in rows } 


with open('families.txt', 'r') as f: 
    for line in f.readlines(): 
     line = line.rstrip().split() 

この場合、ファミリファイルの行とアドレス辞書の項目をループする必要はありませんでした。辞書はキーを検索するために最適化されているので、ファミリファイルをループし、辞書の検索を行います。

 if line[0] in address: 
      line.append(str(address[line[0]])) 
      print('\t'.join(line)) 
     else: 
      line.append('nothing') 
      print('\t'.join(line)) 
1

はこのようにそれを試してみてください。

with open('address.txt') as fh1: 
    data1 = {j[0]: j[1] for j in [i.strip().split('\t') for i in fh1.readlines()]} 

with open('families.txt') as fh2: 
    data2 = {j[0]: j[1] for j in [i.strip().split('\t') for i in fh2.readlines()]} 

result = {k: [v, data1[k]] if k in data1 else [v, 'nothing'] for k, v in data2.items()} 
+0

ちょうど注記:これは、data2(ファミリ)の項目に対してのみループしているように見えます。データ2(ファミリ)にない項目がデータ1(アドレス)にある場合、それらは含まれません。 OPが与える例から、これはOKのようです。 OPだけがそれが常に真であるかどうかを知っている。 – Basya

+0

彼は彼が得たいと言っていた、これは仕事をする:) – zipa

+0

私が言ったように、それは例に合っています。私はちょうどその例が通常そうであるように、それがしないことが明確であるべきだと思った... – Basya

0

私はあなたが辞書に各ファイルを読み込むほうが良いと思います。 "for"ループで2番目のファイルを再読み込みしないでください。

次に、3番目の辞書を作成します。

for key, value in dict1.iteritems(): #python 2.7 

または

for key, value in dict1.items(): #python 3 

あなたはその後、同じキーを使用しますが、値はタプルになる第三の辞書を作成することができます。dict1上

反復。反復の各キーについて、キーがdict1に存在する場合、タプルの最初の部分が値になります。それが存在しない場合、タプルの最初の部分は「何もない」です。次に、2番目の値と同じように2番目の値を指定します。

次に、dict2を繰り返し実行します。各キーをチェックするだけです。すでに新しいディクテーションに入っている場合は、処理しないでください。既に処理されています。そのまま続行してください。

if key in new_dict: 
    continue 

この新しい辞書を作成したら、任意の形式でフォーマットできます。 This postには多くの書式設定オプションがあります。