在宅リーマン勉強日誌

忘れがちな毎日のメモ。

【4日目】KaggleでPythonの勉強してみた【独学】

KaggleにあるCourseでPythonの勉強ができるのでそのノートです。 前回から、考え方とかしっかり書き残しておきたくて、コードを入れていたのですが、Markdownを知らずやっていてすごく見づらかったので、少しはましになるようにググっておきました。 見やすくなるといいなあ!

Tutorialは、内容の和訳(意訳・概要のみ)でExerciseはそのコードを書いた考え方とか解説を書いておきます。 独学には非常にいいコースなんですが、たまに答えだけではすぐにわからなくなるものが出てきたので、使い分けが必要だなあ。

勉強内容

Lesson:Lists Tutorial

勉強時間:60分

Lesson:Lists Exercise

勉強時間:70分

Lesson:Lists Tutorial 

Listsのコース

List

リストは、変数に行列を入れることができるもの 行列は可読性を考えて(一行でも書けるけど)下記のように書くのがよい。

ABC = [
    ['A', 'B', 'C'],
    ['D', 'E', 'F'],
    ['G', 'H', 'I']
]

リストは同じ種類の型式だけでなく、文字と数字も一気に入れられる。

Indexing

リストに入れた中身を取り出すときは、ABC[0]など数字を入れて呼び出す。 リストは0から始まる。

なお、リストの最後の中身を見るときは[-1]で指定する。(それよりも一つ手前は-2、と数字を減らしていく)

Slicing

リストの中身を連続で複数個取り出すときは、ABC[0:3]のように範囲を指定する。 0が、始まりのインデックス、3が取り出す個数を示す。 一番最初から取り出すときは、ABC[:3]のように省略してもいい。

また、個数を指定せず、「〇個目から全部」のように指定したいときは、始まりの数をxとおいて、ABC[x:]と書ける。

最初と最後を省くとき:ABC[1:-1]

最後の3つのみ取り出す:ABC[-3:]

Changing lists

リストの中身を変更するときは、変更する場所を指定して、代入すればよい。

ABC[:3]=[1,2,3]とすればABCが123へ置き換わる。(一気に代入)

List functions

リストの長さ:len()

ソート(ABC順、昇順?):sorted()

合計:sum()

最大値:max()

Interlude: objects

ここまで度々'object'という言葉が出てきたが、解説する。 Pythonではドット構文によってアクセスできる。 例えば虚数を出したいときは、int代入した変数に変数.imagで出すことができる。

この類のオブジェクトは関数を含むこともできる。関数を含んだオブジェクトのことをメソッドと呼ぶ。 関数を含んでいない(.imagとか)はアトリビュートと呼ばれる。

例えば、関数を持つbit_length変数.bit_length()と書く。

ヘルプで呼ぶときは、普通にhelp(bit_length)でもいいし、help(変数.bit_length)でも呼ぶことができる。

List methods

リストに関するメソッドを解説する。

リストの最後に新しい内容を付け加える:list.append

※helpするときは、help(append)だとあまり有益な内容が書いてないので、help(list.append)がよい

最後の内容を削除する:list.pop()

Searching lists

list.index:検索したい単語を()に入れるとどのインデックスにあるかを返す。 検索したい単語がリストにあるかどうか "A" in ABCを出すと存在するとTrue、存在しないとFalseが返ってくる。

リストそのものをhelpすると他にもたくさんの機能が出てくるので、参照するといい。

Tuples

タプルはほぼリストと同じ。

  1. リストの中身は[]で宣言するのに対して、()を使う
x = (1, 2, 3)
x = 1, 2, 3

どちらでも中身を入れることがでっきる。 2. 変更が不可能。

タプルの使用例 複数の返り値を持つ関数で使われる。

例えば、実数を分数で表現するas_integer_ratio() 普通に使うと

x = 0.125
x.as_integer_ratio()

(1,8)

タプルは括弧がいらないので、こんなことも可能

numerator, denominator = x.as_integer_ratio()
print(numerator / denominator)
新出単語

Interlude:幕間、中間 utterly:まったく、すっかり obscure:ぼんやりした tuple:有限な列の長さ immutable:不変の

Lesson:Lists Exercise 

Q1:関数を完成せよ。(リスト2番目)

リストの2番目のエレメントを返す。ただしエレメントがない場合はNoneを返す。 これは割と簡単にlen()を使えばいい

Q2:関数を完成せよ。(最下位チームのキャプテン)

あなたはスポーツチームを分析しています。各チームのメンバーは順にリストに入っています。リストの先頭はコーチで、その次がキャプテン、メンバーと続きます。このリストは成績順に並んでいます。最下位のチームのキャプテンを返す関数を作成してください。

こんな感じかな…。英語からこれが正しいと理解するのに、時間がかかってしまった。

順位 コーチ キャプテン メンバー1
優勝 〇〇 〇〇 〇〇 〇〇
最下位 ×× ×× ×× ××

Q3:関数を完成せよ。(マリオカート

次回のマリオカートのアップデートでは、「パープルシェル」というアイテムが登場する。使用すると最後尾の選手を1位に、1位の選手を最後尾にワープさせる効果を持つ。その効果を発動させる関数を完成させよ スワップの方法は、初期のExerciseで実施済み。それと同じ形で行えばよい。

Q4:len()を使わずに、各リストの長さを予想せよ。

len()を使えばすぐわかる答えですが、どういうものかを把握しておけ、ということですね。 len()は行列になっているとき、行数を数えることがわかりました。列数だと思っちゃいそう。ちょっと危ないです。

Q5:関数を完成せよ。(”ファッショナブル”にパーティに遅刻する方法)

party_attendeesにはパーティに来た人とその順番が書かれています。パーティーのゲストは少なくとも到着順の半分より後に到着した場合、「ファッショナブルに遅れた」とみなされます。しかし、最後であってはなりません。パーティーの参加者リストより、指定した人がファッショナブルに遅刻してきたかを返す関数を作成しなさい。

実際に書き出してみました

1人目(0) 2人目(1) 3人目(2) 4人目(3) 5人目(4) 6人目(5) 7人目(6)
Adela Fleda Owen May Mona Gilber Ford
Adela Fleda Owen May Mona Gilber なし

人を探すときはindexを使うけど、長さは+1になることを注意しないとですね。 表では偶数と奇数を並べて、どういう計算が正しく半分を指定できるか見比べました。 これをもとに愚直にコードを書いて

def fashionably_late(arrivals, name):
    """Given an ordered list of arrivals to the party and a name, return whether the guest with that
    name was fashionably late.
    """
    order = arrivals.index(name)
    
    if ((len(arrivals)-1)//2)<order <(len(arrivals)-1):
        return True
    else:
        return False

これでも正解はするけど、正答例はもっとかっちょいいです。

def fashionably_late(arrivals, name):
    order = arrivals.index(name)
    return order >= len(arrivals) / 2 and order != len(arrivals) - 1

私がif文で書いたものと一緒だけど、確かにReturnのところでTrue/Falseを判断させればいいもんなー こういう書き方あまりしないので、意識して書いた方がいいなあと思いました。

新出単語

iteration:繰り返し infuriate:激怒する