以下は、プレイヤー名でキー付けされた辞書にすべてを読み込みます。各プレーヤーに関連付けられた値は、それ自体がディクショナリであり、さらなる処理に適した形式に変換されたアイテムに関連付けられた名前付きフィールドを持つレコードとして機能します。
info = {}
with open('scoring_info.txt') as input_file:
for line in input_file:
player, stats, outcome, date = (
item.strip() for item in line.split('-', 3))
stats = dict(zip(('kills', 'deaths', 'assists'),
map(int, stats.split('/'))))
date = tuple(map(int, date.split('-')))
info[player] = dict(zip(('stats', 'outcome', 'date'),
(stats, outcome, date)))
print('info:')
for player, record in info.items():
print(' player %r:' % player)
for field, value in record.items():
print(' %s: %s' % (field, value))
# sample usage
player = 'Fizz'
print('\n%s had %s kills in the game' % (player, info[player]['stats']['kills']))
出力:
info:
player 'Shyvana':
date: (2012, 11, 22)
outcome: Loss
stats: {'assists': 5, 'kills': 12, 'deaths': 4}
player 'Miss Fortune':
date: (2012, 11, 22)
outcome: Win
stats: {'assists': 3, 'kills': 12, 'deaths': 4}
player 'Fizz':
date: (2012, 11, 22)
outcome: Win
stats: {'assists': 5, 'kills': 12, 'deaths': 4}
Fizz had 12 kills in the game
または、ほとんどのデータを辞書に保持するのではなく、ネストされたフィールドへのアクセスが少し厄介にinfo[player]['stats']['kills']
なる可能性があります — — 代わりに、もう少し高度な「ジェネリック」クラスを使用してそれらを保持することができます。これにより、info2[player].stats.kills
代わりに書き込むことができます。
Struct
例として、C 言語のstruct
データ型に多少似ているため、私が名前を付けたクラスを使用してほぼ同じことを示します。
class Struct(object):
""" Generic container object """
def __init__(self, **kwds): # keyword args define attribute names and values
self.__dict__.update(**kwds)
info2 = {}
with open('scoring_info.txt') as input_file:
for line in input_file:
player, stats, outcome, date = (
item.strip() for item in line.split('-', 3))
stats = dict(zip(('kills', 'deaths', 'assists'),
map(int, stats.split('/'))))
victory = (outcome.lower() == 'win') # change to boolean T/F
date = dict(zip(('year','month','day'), map(int, date.split('-'))))
info2[player] = Struct(champ_name=player, stats=Struct(**stats),
victory=victory, date=Struct(**date))
print('info2:')
for rec in info2.values():
print(' player %r:' % rec.champ_name)
print(' stats: kills=%s, deaths=%s, assists=%s' % (
rec.stats.kills, rec.stats.deaths, rec.stats.assists))
print(' victorious: %s' % rec.victory)
print(' date: %d-%02d-%02d' % (rec.date.year, rec.date.month, rec.date.day))
# sample usage
player = 'Fizz'
print('\n%s had %s kills in the game' % (player, info2[player].stats.kills))
出力:
info2:
player 'Shyvana':
stats: kills=12, deaths=4, assists=5
victorious: False
date: 2012-11-22
player 'Miss Fortune':
stats: kills=12, deaths=4, assists=3
victorious: True
date: 2012-11-22
player 'Fizz':
stats: kills=12, deaths=4, assists=5
victorious: True
date: 2012-11-22
Fizz had 12 kills in the game