『退屈なことはPythonにやらせよう』その2 (4章)

『退屈なことはPythonにやらせよう』を走っています。Python初心者のセメントの犬です。
前回の記事はこちらになります。

本日は4章「リスト」を攻略していきます。

コードをぼちぼち書き始めると、よくTypeErrorとかにぶち当たるので、その辺を大切にして学習していきたいですね。

それでは張り切っていきましょう~!


Pythonのリスト型とは

これまで、Pythonでは色々な型(データの形だと理解していますがあっていますでしょうか…?)

  • 整数型(int)
  • 浮動小数型(float)
  • 文字列(str)

などを学習してきました。この章ではさらに、「リスト型」が追加されます。


リスト型とは?

#Listの例
tamago = ["cat", "dog", 1, 55, "66"]

のようなものを指します。

“tamago”というのはリストを格納する変数の名前で、自分で勝手に決めて大丈夫なものです。

[] ので囲われた要素の集団がPythonにおけるリストになります。

これらの要素は順番を持っていますが、後から変更することが可能(ミュータブル)です。

順番を持っているということは、文字列型の時のように、前から何番目とかいう形で要素を取り出すことができます。

print(tamago[2])
#出力は 1

print(tamago[0:3])
#出力は["cat", "dog", 1]

ちなみに、順番の番号は0から始まります。

また、[0:3]のような形でスライスすることもできます。この場合、3の一つ前の要素まで取り出されます。(よくこんがらがります)

ミュータブルなので、値を代入することで、リストの中身を変えることもできます。

#もとのtamago = ["cat", "dog", 1, 55, "66"]

tamago[1] = "inu"
#tamago = ["cat", "dog", 1, 55, "66"]となる

tamago[1:3] = 5
#これはスライスしている要素の数(二つ)と代入している要素の数(一つ)が合わないためか、TypeErrorが返ってきた。

tamago[1:3] = 5, 4
#tamago = ["cat", 5, 4, 55, "66"]となる


#リスト同士の結合も出来る
tamago = ["cat", "dog", 1, 55, "66"]
tamago = tamago + [1, 2, 3]
print(tamago)
# ["cat", "dog", 1, 55, "66", 1, 2, 3]
#ちなみに、「+=」なども使うことができる

というように、要素を変更することが出来ます。


イミュータブルなものはタプル

リストとは違って、中身にあたる要素を変更できない(イミュータブルな)ものがタプルです。

タプルは ( )で囲われ、間は「,」で区切られます。

#いろいろなタプル
yude_tamago = ("cat", "dog", 1, 55, "66")

#要素がひとつのタプル
yude_tano = ("cat",)  #これはタプル

#カンマが無いと文字列になる
yude_tano = ("cat")   #これは文字列

今回は省略するが、タプルもリストと同じように中身を参照することができます。

しかし、リストのように「=」を使って中身を入れ替えることはできません。


リストを変数に格納したとき

以下のコードでは、一つのリスト([ ]の部分)を、二つの変数に代入するとどうなるかの例になります。

tamago = ["cat", "dog", 1, 55, "66"] #もとの変数
chicken = tamago #変数のtamagoをchickenに入れた

chicken[2] = "Umai"   #Chickenの要素を変更した

print(tamago[2])
#出力は "Umai" となる。

なぜこういうことが起きるかというと、

二つの変数(tamagoとchicken)は同じリスト[“cat”, “dog”, 1, 55, “66”] を参照しているためです。

もしtamagoの中身を変更せず、chickenの中身をいじりたいようなシチュエーションには、copyを使います

import copy  #モジュールのimportが必要です

tamago = ["cat", "dog", 1, 55, "66"] #もとの変数

chicken = copy.copy(tamago) #変数のtamagoをコピーしてchickenに入れた
#chicken = list(tamago)としても同じ結果となる。

chicken[2] = "Umai"   #Chickenの要素を変更した

print(tamago[2])
#出力は 1 となる。

print(chicken[2])
#出力は "Umai" となる。

上記のものと関連して、copy.deepcopy()という関数もあるのですが、いまいちピンと来ていません。

説明によると、リストの中にリストを持つようなものをコピーできるようですが、うーん…


リスト型で使えるメソッド(index, append, insert, remove, sort)

リストで使えるメソッドを紹介していきます。

詳細は公式ドキュメンテーションなどにより詳しい説明があるので、del文なども交えて、一挙に紹介してしまおうと思います。

tamago = ["cat", "dog", 1, 55, "66"]

#index
tamago.index("dog")
# 出力は 1

#append
tamago = ["cat", "dog", 1, 55, "66"]
tamago.append("nezumi")
# ["cat", "dog", 1, 55, "66", "nezumi"]

#insert
tamago = ["cat", "dog", 1, 55, "66"]
tamago.insert(2, "nezumi")
# ["cat", "dog", "nezumi", 1, 55, "66"]

#remove (要素で指定して消す)
tamago = ["cat", "dog", 1, 55, "66"]
tamago.remove("dog")
# ["cat", 1, 55, "66"]

#del (index番号で指定して消す。)
tamago = ["cat", "dog", 1, 55, "66"]
del tamago[2]
# ["cat", "dog", 55, "66"]

#sort
tamago = ["cat", "dog", 1, 55, "66"]
tamago.sort()
#文字列と整数は比べられないため、エラーになる。

yude_tamago = ["cat", "dog", "1", "Bacon", "Cheese", "55", "6"]
yude_tamago.sort()
#sortの戻り値はNoneTypeなので、print(yude_tagago.sort())としてもNoneとなる。
#中身が見たい時は素直に
print(tamago)
# ['1', '55', '6', 'Bacon', 'Cheese', 'cat', 'dog']

#大文字と小文字の違いを無視したい場合は
yude_tamago.sort(key=str.lower)
print(yude_tamago)
# ['1', '55', '6', 'Bacon', 'cat', 'Cheese', 'dog']

これらのメソッドはリストに対してはいつでも使えます。

逆に、リスト型じゃないものにこれらを使おうとすると、エラーが出たりします。

データ型と使えるメソッドの関係は、完璧に暗記するわけではないですが、ある程度把握しておきたいですね。

演習プロジェクトの解答

今回の章で学んだことを生かして、二つの課題に挑戦しました。

演習課題4-1:「カンマ付け」

spamなどの任意のリストに対して、要素を順番に、カンマ区切り+半角スペースで順番に出力、最後の要素の前には「and」をつけてね、という課題でした。

#カンマ付け
spam = ["apples", "bananas", "tofu", "cats"]

def add_comma(some_list):
    comma = ""
    for i in some_list:
        if i != some_list[-1]:
            comma += (i + ", ")
        else:
            comma += ("and " + i)
    return print(comma), print(type(comma))

add_comma(spam)

#出力は apples, bananas, tofu, and cats
#       <class 'str'>

割とすんなり解けました。spam以外のリスト(長さが変わっても大丈夫)を渡してもきちんと動くはずです。

演習課題4-2:文字絵グリッド

グリッドが与えられ、目標となる出力をfor文を用いて出力する課題でした。

#文字絵グリッド(課題として与えられたもの)
grid =[[".", ".", ".", ".", ".", "."],
       [".", "0", "0", ".", ".", "."],
       ["0", "0", "0", "0", ".", "."],
       ["0", "0", "0", "0", "0", "."],
       [".", "0", "0", "0", "0", "0"],
       ["0", "0", "0", "0", "0", "."],
       ["0", "0", "0", "0", ".", "."],
       [".", "0", "0", ".", ".", "."],
       [".", ".", ".", ".", ".", "."]]


#..00.00..
for i in range(0, len(grid)):
    print(grid[i][0], end="")
print("")

print("-----------")

"""
欲しい出力
..00.00..
.0000000.
.0000000.
..00000..
...000...
....0....
"""
for i in range(0, len(grid[0])):
    for j in range(0, len(grid)):
        print(grid[j][i], end="")
    print("")

#実際の出力は以下の通り。
"""
..00.00..
-----------
..00.00..
.0000000.
.0000000.
..00000..
...000...
....0....
"""

データフレーム型をいじるための前段階的な感じなのかなあと思いつつ、解いてみました。

一番大変だったのは、もとのグリッドのリストを入力するところでした。


まとめ

今回は『退屈なことはPythonにやらせよう』の4章を勉強しました。次回からはさらにボリューミーになっていくような気がします。

あんまり色々と載せすぎてもよくないかもしれないので、次回はもう少し簡潔にして、演習課題のほうを中心に書いていこうかなと思います。


次の記事はこちら↓

『退屈なことはPythonにやらせよう』その2 (4章)” に対して1件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です