あなたのコードは合理的ですが、代替手段は次のとおりです。
import collections
with open('grid_file.txt', 'r') as f:
columns = next(f).split()
matrix = collections.defaultdict(dict)
for line in f:
items = line.split()
row, vals = items[0], items[1:]
for col, val in zip(columns, vals):
matrix[col][row] = int(val)
print(matrix)
利回り
defaultdict(<type 'dict'>, {'A': {'A': 0, 'C': 6, 'B': 3}, 'C': {'A': 2, 'C': 0, 'B': 5}, 'B': {'A': 1, 'C': 7, 'B': 0}})
いくつかのヒント:
使用する
with open(...) as f
...
それ以外の
f = open(...)
f.close()
Pythonが
with-block
. _ を使用with
すると、ファイルハンドルを閉じるのを忘れることはありません。また、例外が発生した場合でも、with-block
.
f.readlines()
一般的には、できれば避けたほうがよいでしょう。これにより、ファイル全体がリストに丸呑みされます。特にファイルが巨大な場合、これはメモリに負担がかかる可能性があります。いつもの
with open(...) as f:
for line in f:
代わりに使用できます。
collections.default(dict)を
作成matrix
すると、デフォルトで になります。したがって、初期化をスキップできます。matrix[field]
dict
for key in keys:
matrix[key] = {}
Adefaultdict
は のサブクラスなdict
ので、 a と同じように使用できますdict
。印刷方法が気に入らない場合、または空の dict をfor anyにmatrix
自動的に割り当てるの
をやめたい場合は、次の方法でdefaultdict を通常の辞書に戻すことができます。matrix[key]
key
dict
matrix = dict(matrix)
可能であれば、数値インデックスを使用しないでくださいfor-loops
。
for i, c in enumerate(chars[1:]):
これはほとんどの C ライクな言語では必須ですが、Python にはより良い方法があります: 項目自体をループすることです:
for col, val in zip(columns, vals):
これにより、変数名が実際に関心のあるオブジェクトに割り当てられるため、コードが読みやすくなります。インデックスだけでなく、keys[i-1]
. また、 で行われているように、インデックスを 1 つずつ調整する必要がある場合に発生する可能性のある「1 つずれた」エラーを回避するのにも役立ちますkeys[i-1]
。
もう 1 つの可能性は、ネストされた dict ではなく、キーとして 2 タプル (列、行) を使用することです。
with open('grid_file.txt', 'r') as f:
columns = next(f).split()
matrix = {}
for line in f:
items = line.split()
row, vals = items[0], items[1:]
for col, val in zip(columns, vals):
matrix[col, row] = int(val)
print(matrix)
収量
{('B', 'C'): 7, ('A', 'A'): 0, ('B', 'B'): 0, ('B', 'A'): 1, ('C', 'A'): 2, ('C', 'B'): 5, ('C', 'C'): 0, ('A', 'B'): 3, ('A', 'C'): 6}
次に、次のようにマトリックスの (列、行) にアクセスできます。
print(matrix['A','C'])
# 6
ちなみに、pandasをインストールする場合:
import pandas as pd
import io
text = '''\
A B C
A 0 1 2
B 3 0 5
C 6 7 0'''
df = pd.read_table(io.BytesIO(text), sep='\s+')
print(df.to_dict())
収量
{'A': {'A': 0, 'B': 3, 'C': 6},
'B': {'A': 1, 'B': 0, 'C': 7},
'C': {'A': 2, 'B': 5, 'C': 0}}