たとえば,アルファベット26文字の中からランダムに1文字選んでリストに追加する処理を50回行ったとすると,
makedata.py
import random
chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
data = []
for i in range(50):
data.append(random.choice(chars))
print(data)
data
['Y', 'B', 'G', 'H', 'D', 'R', 'I', 'I', 'R', 'R', 'R', 'W', 'R', 'R', 'L', 'P', 'V', 'K', 'N', 'M', 'O', 'T', 'P', 'T', 'I', 'E', 'S', 'Q', 'F', 'W', 'W', 'T', 'D', 'M', 'E', 'E', 'R', 'R', 'X', 'E', 'X', 'K', 'K', 'T', 'L', 'Y', 'D', 'C', 'F', 'N']
このように要素数50個かつ重複ありのアルファベットのリストが得られる.
ここで,data
内において少なくとも1回は登場するアルファベットに対して,数値ラベルを0から順番につけたいという状況を考える.以前は,
unique.py
data_dict = {}
count = 0
for char in data:
if char not in data_dict.keys():
data_dict[char] = count
count += 1
print(data_dict)
data_dict
{'Y': 0, 'B': 1, 'G': 2, 'H': 3, 'D': 4, 'R': 5, 'I': 6, 'W': 7, 'L': 8, 'P': 9, 'V': 10, 'K': 11, 'N': 12, 'M': 13, 'O': 14, 'T': 15, 'E': 16, 'S': 17, 'Q': 18, 'F': 19, 'X': 20, 'C': 21}
のようなコードを書いていたのだが,count
という変数をわざわざ用意してインクリメントしていくのは微妙な気がしていた.
そこで,このような書き方があることに気づいた.
unique.py
data_dict = {}
for char in data:
if char not in data_dict.keys():
data_dict[char] = len(data_dict) #data_dictのサイズを数値ラベルとして付与
print(data_dict)
data_dict
{'Y': 0, 'B': 1, 'G': 2, 'H': 3, 'D': 4, 'R': 5, 'I': 6, 'W': 7, 'L': 8, 'P': 9, 'V': 10, 'K': 11, 'N': 12, 'M': 13, 'O': 14, 'T': 15, 'E': 16, 'S': 17, 'Q': 18, 'F': 19, 'X': 20, 'C': 21}
要は,新しいユニークなアルファベットが登場した際につける数値ラベルを,その時点でのdata_dict
のサイズにしただけである.
細かいところだが,ちょっとした工夫でコードの見映えは変わったと思う.
自然言語処理で学習データとして使用する文章を単語単位で区切ってリストに追加していき,得られる単語群から少なくとも1回は登場する単語に対して順番に数値ラベルをつけていくときにこんなことを考えたので,メモ程度に.