UdemyでPythonを勉強した結果を残すブログ。

40歳でプログラミング始めて転職までいけるのかを実録してみます。

DAY26 リスト・ディクショナリーを内包記述してコード数削減&名前でフォネティックコードを取得するツールを作成

今回の講義では内包記述、という言い方が合っているかどうかわからないが

英語では comprehensionという書き方を使ってコードをスッキリ・簡潔に書く練習をしつつ、アルファベットのフォネティックコードを取得するツールを作成してみる。

ここでは毎回単語かくのもあれなので内包記述としておく。

 

最初にフォネティックコードとは、電話などでLかMか聞き取りにくい文字を

わかりやすくするために

L = Lima

M = Mike と伝えやすくするように単語で伝えるようにするためのコードです。

www.worldometers.info

 

日本語でも電話とかであるやつ。

田中の田はたんぼの田、中は中国の中、とか。

 

 

内包記述(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での内包記述はいくつかあるので

 

qiita.com

 

ここなどに詳しく書かれています。

 

 

ある程度の内包記述の型を覚えてから、フォネティックコードを取得するツールを

pythonで作ってみます。

 

どういう出力をするかというと、

 

出力イメージはこんな感じ

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も使えるのかな?と試してみたら使えたので採用しました。笑

 

データはこちら。

 

github.com