2017-10-25 9 views
3

に一致する私は、次の形式で「辞書」テキストファイルがあります。パイソン - 反復辞書は

D1 2 1 3 4 78.5 
D2 2 3 4 5 100.2 
D3 2 1 5 6 35.2 
... 

私は出力:

1 CH a 
2 H1 a 
3 H2 a 
4 H3 b 
5 CO b 
6 HA b 
... 

を、私はこのようになり、入力ファイルを持っています取得しようとしている:

a H1 a CH a H2 b H3 78.5 
a H1 a H2 b H3 b CO 100.2 
a H1 a CH b CO b HA 35.2 

辞書ファイルを、最初の列をkとする列に分割しようとしていますeyと2番目と3番目の列を値として返します。次に、入力ファイルを列で読み取り、列[1:4]の数値を以前に生成されたキーと一致させ、対応する値を出力します。入力ファイルの最後の列については、識別子に値と一致する別のキー/値のペア(たとえば、key=4, value=78.5)を作成しました。

file = open("dictionary.txt", "r") 
one_dict = dict() 
two_dict = dict() 
for line in file: 
    fields = line.split(" ") 
number = fields[0] 
name = fields[1] 
letter = fields[2] 
one_dict[int(number)] = [letter, name] 

with open('input.txt') as infile: 
    for line in infile: 
    fields = line.split("\t") 
value = fields[6] 
col_4 = fields[4] 
two_dict[int(col_4)] = [value] 
for x in fields[1: 3]: 
    if x in one_dict: 
     output[x] = one_dict[x] 
    for col_4 in fields: 
     if x in one_dict: 
      col_4 = one_dict[x[value]] 
      print(output[x], output4[x], two_dict[col_4]) 

私のスクリプトは何も返されず、理由はわかりません。

+0

をこれは 'とほとんど些細なことだろうpandas'ですが、単に 'csv'で行うことができるはずです... –

+0

このコードでは決して出力を定義しません。他の場所で定義されていると思います。より完全なコード例を投稿できますか? –

+0

字下げの問題があるようです。例えば、 'field'を参照するforループはforループの本体の外側にあるように見えます。コードスニペットを正しい字下げにするように再フォーマットできますか? – JeremyKun

答えて

1

あなたはこれをオーバーエンジニアリングしています。マッパー、つまり辞書を作成し、中央の列にマッピングします。だから、偽の入力データを使用して:

In [34]: s1 = """1 CH a 
    ...: 2 H1 a 
    ...: 3 H2 a 
    ...: 4 H3 b 
    ...: 5 CO b 
    ...: 6 HA b""" 

In [35]: s2 = """D1 2 1 3 4 78.5 
    ...: D2 2 3 4 5 100.2 
    ...: D3 2 1 5 6 35.2""" 

In [36]: import io 

ので、マッパーを作成します。

In [37]: with io.StringIO(s1) as f: # pretend string is a file 
    ...:  mapper = {} 
    ...:  for line in f: 
    ...:   key, _ , value = line.partition(' ') 
    ...:   mapper[key] = value.strip() 
    ...: 

In [38]: mapper 
Out[38]: {'1': 'CH a', '2': 'H1 a', '3': 'H2 a', '4': 'H3 b', '5': 'CO b', '6': 'HA b'} 

その後、迅速かつ汚い何か:

In [40]: buffer = io.StringIO() # fake output file 
    ...: with io.StringIO(s2) as infile, buffer as outfile: 
    ...:  for line in infile: 
    ...:   _, *data, last = line.split() 
    ...:   outfile.write(' '.join(map(mapper.get, data))) 
    ...:   outfile.write(" " + last + "\n") 
    ...:  result = buffer.getvalue() # get the value before we "close" the fake file 
    ...: 
    ...: 

In [41]: print(result) 
H1 a CH a H2 a H3 b 78.5 
H1 a H2 a H3 b CO b 100.2 
H1 a CH a CO b HA b 35.2