『退屈なことは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件のコメントがあります。