LoginSignup
3
3

More than 5 years have passed since last update.

Pythonでリスト中のユニークな要素に対して順番に数値ラベルをつけていくコードについて

Last updated at Posted at 2018-05-19

たとえば,アルファベット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回は登場する単語に対して順番に数値ラベルをつけていくときにこんなことを考えたので,メモ程度に.

3
3
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3