今回の講義では内包記述、という言い方が合っているかどうかわからないが
英語では comprehensionという書き方を使ってコードをスッキリ・簡潔に書く練習をしつつ、アルファベットのフォネティックコードを取得するツールを作成してみる。
ここでは毎回単語かくのもあれなので内包記述としておく。
最初にフォネティックコードとは、電話などでLかMか聞き取りにくい文字を
わかりやすくするために
L = Lima
M = Mike と伝えやすくするように単語で伝えるようにするためのコードです。
日本語でも電話とかであるやつ。
田中の田はたんぼの田、中は中国の中、とか。
内包記述(comprehension)をざっくり覚える
内包記述の便利なところは、通常なら数行書くコードを1行でまとめられるところ。
例えば、
numbers = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
このリストを偶数のみでリスト作り直す場合は今までなら
numbers = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
guusuu = []
for i in numbers:
if i % 2 == 0:
guusuu.append(i)
print(guusuu)
とfor の部分で3行使うところを内包記述であれば
numbers = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
guusuu = [ n for n in numbers if n % 2 == 0]
print(guusuu)
書き方は
guusuu = [ 要素に直接変更したい新しい要素 for リストの1つずつの要素 in リスト名 (if リストの中から要素を抽出したい場合などに使う)]
こんな感じ。
guusuu のリストの中に型に合わせて記述をすることでコード数がすっきりと。
リストだけでなく、辞書型リストでもできる。
辞書型リストはpandasでも使われるので覚えた方がいい。
辞書型の内包記述
names = ["太郎", "二郎", "三郎", "四郎", "吾郎", "剛", "慎吾"]
student_group = { name:f"group {random.randint(1, 5)}" for name in names }
print(student_group)
出力されるのはこんな感じ
{'太郎': 'group 3', '二郎': 'group 3', '三郎': 'group 3', '四郎': 'group 2', '吾郎': 'group 1', '剛': 'group 5', '慎吾': 'group 4'}
かっこが [] じゃなく {}なので注意。最初の部分が a:bの辞書型になっています・
pandasの場合は
import pandas
student_dict = {
"student" : ["A", "B", "C"],
"tensuu" : [80, 75, 30]
}
data = pandas.DataFrame(student_dict)
print(data)
student_score = {row.student:row.tensuu for (index, row) in data.iterrows()}
print(student_score)
出力は
student tensuu
0 A 80
1 B 75
2 C 30
{'A': 80, 'B': 75, 'C': 30}
こんな感じ。
辞書型の出力方法・pandasでの内包記述はいくつかあるので
ここなどに詳しく書かれています。
ある程度の内包記述の型を覚えてから、フォネティックコードを取得するツールを
pythonで作ってみます。
どういう出力をするかというと、
- フォネティックコードのcsvを読み込み、辞書型リストに変換する
- 適当なアルファベットを入力してもらう
- 入れてもらった文字を1文字ずつフォネティックコードと照らし合わせる
- A for Alfa みたいな感じで1文字ずつ出力する
出力イメージはこんな感じ
Type a word you want. : gakpy
G for Golf
A for Alfa
K for Kilo
P for Papa
Y for Yankee
それでは始めます。
import pandas
phonetic = pandas.read_csv("phonetic_alphabet.csv")
df = {row.letter: row.code for index,row in phonetic.iterrows()}
読み込んだcsvをpandasで出力するとこんな感じ
letter code
0 A Alfa
1 B Bravo
2 C Charlie
pandasをインポートして、csvを読み込みます。
早速1つ目の内包記述で、データフレームのphoneticをiterrows()で1行ずつ読み込んで、rowは 0 A Alfa のオブジェクトとなる。辞書型リストになると
{'A': 'Alfa', 'B': 'Bravo', 'C': 'Charlie',,,,
という感じに保存されます。
answer = input("Type a word you want. : ").upper()
answer_letter = [letter for letter in answer if answer.isalpha()]
answerで質問をして、answer_letterで2つ目の内包記述。一番基礎のやつ。
answer = gakpyの場合、["G", "A", "K", "P", "Y"]というリストに変換されます。
アルファベット以外を入れたら動作しないようにしたかったので、そういう機能ないかなとググったら.isalpha()というのがあったので追加。
最後に、それぞれをデータフレームと照らし合わせてフォネティックコードを取得するコードへ。
answer_phonetic = {print(f"{letter} for {df[letter]}") for letter in answer_letter}
これも1行だけ。
GAKPYの場合はdf[letter]を記述することでdfのcode= Golfを取得してprintでコンソールに出力しています。
今回の講座ではアウトプットは辞書型リストだったのですが、
内包記述の最初の部分はprintも使えるのかな?と試してみたら使えたので採用しました。笑
データはこちら。