We All Get Old - Naskin Diary

Yet Another My Life On The Web

Pythonで文字列インデックスで負数を活用してみた

初めてのPython 第3版」を読んで文字列などのシーケンスオブジェクトのインデックス(C言語の配列の添字)には負数を使えることを知っていたけど、初めて知ったときには「ふーん」という感じだったけど知っていて良かったと思う経験をしました。


F1世界選手権サーキットMAP」ではドライバーの名前(ファミリーネーム)を一覧表示用に持っているのですが、名前は「ファーストネーム ファミリーネーム」とスペース区切りで一つの情報としてデータストアに保存しています。


Jenson Button」という文字列から「Button」の「B」を取得しないといけないのですが、「Elio de Angelis」といったスペースが3つ入ったドライバーいるので単純に空白区切りで2つ目の文字列の先頭文字を取得すればいいという訳ではないので自分で入力していました。


ここでシーケンスオブジェクトの最後の要素を指定する負数のインデックスの出番です。

>>> name = 'Jenson Button'
>>> name.split(' ')
['Jenson', 'Button']
>>> str(name[-1])[0]
'n'
>>> str(name.split(' ')[-1])[0]
'B'
>>> name = 'Elio de Angelis'
>>> str(name.split(' ')[-1])[0]
'A'

文字列を分割する split() を使わないと「n」が表示されてしまいました><


まずは文字列を split() で空白区切りで分割します。

>>> name = 'Jenson Button'
>>> name.split(' ')
['Jenson', 'Button']


分割したオブジェクトの一番最後の要素を指定すると

>>> name.split(' ')[-1]
'Button'

見事にファミリーネームが取得できたました。


あとは先頭の要素を取り出すだけです。

>>> name.split(' ')[-1][0]
'B'
>>> name = 'Elio de Angelis'
>>> name.split(' ')[-1][0]
'A'

str() に渡さなくても取れました。でも str(name.split(' ')[-1])[0]とした方が他の人が読みやすそうではあります。


これでデータストアに保存している名前のインデックスは動的に作り出せるかなと思ったのですが、1956年のアルゼンチンGP1957年の英国GPのように勝利者が2人記録されている場合に今のデータ形式では対処出来なさそうなので結局はデータストアを使用せざるを得なさそうです。