Pythonで作業を効率化しよう!Python基礎固め①編
Light Webアルバイトのマキシと言います。 日々の作業の効率化をできるようにするためにPythonを習得しようと思い立ちました。 Pythonはシンプルなコードで初学者にも優しいプログラミング言語で豊富なライブラリを使うことで、自分が1からすべて作るのではなく、効率的にプログラムの作成を進めることができます。 そんな人気の高いプログラミング言語のPythonの基礎からスクレイピングまでの学習のアウトプットを月1で連載していきたいと思います。 1~3回までの内容は自動化に必要な箇所のみを取り上げてきたのですが、基礎の部分を飛ばして進めていたため改めて基礎を勉強し直す基礎固め編になります。 今回は「データ型」についてです。
01データの型について
01-1.データの基本「数値型・文字列型」
変数を宣言して値を代入する際にデータの型によって処理が変わります。
例えば以下のような例では、” ” ダブルクォーテーション、もしくは’ ‘ シングルクォーテーションで囲う場合と囲わない場合では出力が変わります。
x="3+8"
y=3+8
print(x)
print(y)
---------- #出力 ----------
3+8
11
変数xの方は、3+8と出力されました。一方変数yでは8と出力されています。
” ” ダブルクォーテーション、もしくは’ ‘ シングルクォーテーションで囲うとデータは文字列として出力されます。
これを文字列(str)型と言います。
文字を連結するときには” ” ダブルクォーテーション、もしくは’ ‘ シングルクォーテーションで囲った文字同士を+で繋ぐと連結できます。
x="3"+"8"
y=3+8
z="Python"+"基礎"
print(x)
print(y)
print(z)
---------- #出力 ----------
38
11
Python基礎
また改行を含む複数行の文字列を扱うには、”””で囲みます。
a="""
Python
1.データ型の基本
文字列型と数値型
"""
print(a)
---------- #出力 ----------
Python
1.データ型の基本
文字列型と数値型
一方データを” ” ダブルクォーテーション、もしくは’ ‘ シングルクォーテーションで囲わない場合は数値となります。
これを数値(int)型と言います。
なので計算をする場合は数字を” ” ダブルクォーテーション、もしくは’ ‘ シングルクォーテーションで囲わないようにしましょう。
また整数の除算をする場合Python2では整数で返していましたが、Python3からは / 演算子を使うと常に浮動小数点数が返されます。これをfloat(浮動小数点)型と言います。
x= 5/3
print(x)
---------- #出力 ----------
1.6666666666666667
01-2.リスト(list)型
リストは、角括弧 [ ] で囲むと、複数のデータを構成できます。それぞれの要素はカンマ(,)で区切ります。
data = ["Python","PHP","JavaScript"]
print(data)
---------- #出力 ----------
['Python', 'PHP', 'JavaScript']
リストは型の種類を問わず(文字列、整数、論理など)格納できます。多次元リストのために、リストにリストを格納することもできます。
リストの中身や型は変更可能です。リストの先頭や末尾に要素を追加することができますし、任意の位置にも要素を追加できます。
リストはインデックス(要素の順番)を持っています。このインデックスの番号は、他の言語と同様に[0]から始まり1ずつ増えていきます。
リストの最後の要素を取り出したい場合は、ネガティブインデックス(-1)と指定することも可能です。
data = ["Python","PHP","JavaScript"]
print(data[0])
print(data[-1])
---------- #出力 ----------
Python
JavaScript
リストに要素を追加する
リストへ要素を追加するには、append()を使用します。append()で追加すると、リストの末尾に要素が追加されます。
data = ["Python","PHP","JavaScript"]
data.append("HTML")
print(data)
---------- #出力 ----------
['Python', 'PHP', 'JavaScript', 'HTML']
リストから要素を削除する
リストから要素を削除するには、remove()を使用します。
data = ["Python","PHP","JavaScript","HTML"]
data.remove("HTML")
print(data)
---------- #出力 ----------
['Python', 'PHP', 'JavaScript']
リストのスライス
リストを取り出すときに、インデックスの開始と終了の範囲を指定できます。
スライスの記法は[1:2]のように、開始インデックスと終了インデックスをコロンで区切って取得することができます。
範囲には終了値に指定された値は含まれず、終了値-1までになります。
data = ["Python","PHP","JavaScript","HTML"]
print(data[0:2])
---------- #出力 ----------
['Python', 'PHP']
先頭のインデックスと、終了のインデックスは省略可能です。 先頭のインデックスだけを指定した場合は、指定した先頭から末尾までのリストが返されます。終了のインデックスだけを指定した場合は、最初から指定した末尾までのリストが返されます。
data = ["Python","PHP","JavaScript","HTML","CSS"]
print(data[2:])
print(data[:3])
---------- #出力 ----------
['JavaScript', 'HTML', 'CSS']
['Python', 'PHP', 'JavaScript']
リスト内の要素の変更
リストのインデックス番号を指定して、データを変更することが可能です。
data = ["Python","PHP","JavaScript","HTML","CSS"]
data[2] = "jQuery"
print(data)
---------- #出力 ----------
['Python', 'PHP', 'jQuery', 'HTML', 'CSS']
リストを並び替える
sort()を使用することで、リストの要素順に並び替えられます。 並び替えは昇順になります。
data1 = ["Python","PHP","JavaScript","HTML","CSS"]
data2 = [85, 14, 5, 8, 11]
print(data1)
print(data2)
data1.sort()
data2.sort()
print(data1)
print(data2)
---------- #出力 ----------
['Python', 'PHP', 'JavaScript', 'HTML', 'CSS']
[85, 14, 5, 8, 11]
['CSS', 'HTML', 'JavaScript', 'PHP', 'Python']
[5, 8, 11, 14, 85]
リストを逆順に並び替える
reverse()を使うと、リストを反対に並び替えられます。 こちらはsort()と違いリスト内の要素がそのまま反対に並び替えられる形になります。
data1 = ["Python","PHP","JavaScript","HTML","CSS"]
data2 = [85, 14, 5, 8, 11]
print(data1)
print(data2)
data1.reverse()
data2.reverse()
print(data1)
print(data2)
---------- #出力 ----------
['Python', 'PHP', 'JavaScript', 'HTML', 'CSS']
[85, 14, 5, 8, 11]
['CSS', 'HTML', 'JavaScript', 'PHP', 'Python']
[11, 8, 5, 14, 85]
01-3.タプル型
タプル型はリスト型と同じように複数の要素をまとめて扱うことのできるデータ型です。 リスト型と異なる点は、タプルにはイミュータブル(変更不可)な性質を持ちます。なのでリストのappend()やremove()のようなメソッドも使用して要素の追加や削除はできません。 タプル型は()で括ってデータを定義します。各要素はカンマで区切ります。
data = ("apple","orange","banana")
print(data)
---------- #出力 ----------
('apple', 'orange', 'banana')
タプル型のメリット
タプルはリストのような要素やインデックスの変更はできませんが、その分、戻り値や不変にしておきたいデータ群を設定することに役立ちます。 また、リストよりも高速にデータを処理できます。要素を更新しないのであれば、タプルで処理させた方がパフォーマンスは向上します。
01-4.セット型
セットも複数の要素を格納する型ですが、リストやタプルのような要素の順番を持ちません。リストは同じ内容の要素を何回でも追加でき、それぞれがインデックス番号を持っていました。
一方、セットはユニーク(固有)の要素しか保持しないため、要素の重複がありません。セットは以下のように波括弧 { } で括り、カンマ(,)で区切ります。
data = {"apple","orange","banana"}
print(data)
---------- #出力 ----------
{'apple', 'banana', 'orange'}
空の波括弧{}は次で紹介する辞書(dict)型と見なされるため、空のset(空集合)を生成するにはset()を使います。
リストやタプルをセットに変換する
またset()メソッドを用いてリストやタプルからセットに変更することも可能です。
dataList = ["apple","orange","banana"]
print(set(dataList))
---------- #出力 ----------
{'apple', 'banana', 'orange'}
セットに要素を追加する
セットはadd()メソッドで要素を追加できます。
data = {"apple","orange","banana"}
data.add("melon")
print(data)
---------- #出力 ----------
{'apple', 'banana', 'melon', 'orange'}
同じ要素をadd()で追加しても無視されます。
data = {"apple","orange","banana"}
data.add("apple")
print(data)
---------- #出力 ----------
{'apple', 'banana', 'orange'}
セットはユニークなオブジェクトの判別のために、ハッシュ値を使用しています。このため、リスト型のようなオブジェクトはセットに追加できません。
data = {["apple","orange"],"banana"}
print(data)
---------- #出力 ----------
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[8], line 1
----> 1 data = {["apple","orange"],"banana"}
2 print(data)
TypeError: unhashable type: 'list'
セットから要素を削除する
セットから要素を削除するには、remove()またはdiscard()メソッドを使用します。
data = {"apple","orange","banana","melon"}
data.remove("apple")
print(data)
---------- #出力 ----------
{'banana', 'melon', 'orange'}
remove()とdiscard()の違い
remove()で削除すると、対応する要素がない場合に、KeyErrorというエラーが出力されます。
data = {"orange","banana","melon"}
data.remove("apple")
print(data)
---------- #出力 ----------
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
Cell In[10], line 2
1 data = {"orange","banana","melon"}
----> 2 data.remove("apple")
3 print(data)
KeyError: 'apple'
discard()で削除した場合、対応する要素がなくても、エラーは出力されません。
data = {"orange","banana","melon"}
data.discard("apple")
print(data)
---------- #出力 ----------
{'orange', 'banana', 'melon'}
セット型のメリット
setでは重複している要素は自動的に排除する仕組みになっています。
重複なしでデータを処理したい場合に有効となるでしょう。リスト型と同じようにfor文でループ処理することも可能です。
複数の集合データで共通する要素だけ取り出したい時(積集合)や、片方にあってもう片方にないデータを取得したい場合(差集合)といった集合処理をする際に活用できます。
重複を除外してデータを結合する(和集合)
和集合は、複数の集合データにある要素全てを意味します。このような場合はunion()で結合すると便利です。
data1 = {"apple","orange","banana"}
data2 = {"apple","lemon","melon"}
data1.union(data2)
---------- #出力 ----------
{'apple', 'banana', 'lemon', 'melon', 'orange'}
上記のように重複する要素”apple”は一つにまとめられて結合されていることがわかります。
重複している要素を抽出する(積集合)
積集合は、複数の集合データから共通するデータのみを集めたものになります。
複数のデータセットから重複している要素のみを取り出したい場合にはinterection()または&演算子を用います。
data1 = {"apple","orange","banana"}
data2 = {"apple","lemon","melon"}
data1.intersection(data2)
---------- #出力 ----------
{'apple'}
セットに固有な要素を抽出する(差集合)
差集合は、どちらか一方には含まれているがもう片方には含まれていないデータになります。
二つのセットから重複していないユニークデータを発見したい場合にはdifference()または-演算子を使用します。
-演算子では少ないデータから多いデータを引くとset()となり空のデータが入りますので注意が必要です。
data1 = {"apple","lemon","orange","banana","grape"}
data2 = {"apple","lemon","banana"}
data2.difference(data1)
---------- #出力 ----------
set()
両方に含まれていない要素を抽出する(対象差集合)
対称差集合は、複数の集合データの中で他と重複しない要素のみを抽出したデータになります。
二つのセットから共通で含まれていない要素を抽出したい場合には、symmetric_difference()を使用します。
data1 = {"apple","lemon","orange","banana"}
data2 = {"apple","grape","banana"}
data1.symmetric_difference(data2)
---------- #出力 ----------
{'grape', 'lemon', 'orange'}
AセットにBセットが含まれているかを判定する
あるセットが他のセットの部分集合(すべての要素が他のセットに含まれている)であるかどうかをチェックするためのメソッドのissubset()を使用することで判別が可能です。
setA = {"apple","grape","banana"}
setB = {"apple","lemon","orange","banana"}
setA.issubset(setB)
---------- #出力 ----------
False
上記の場合、setAがsetBの部分集合であるかをチェックしています。setAの全ての要素がsetBに含まれているためTrueになります。
注意点としては、issubset()はセット型のメソッドであり、リスト型には存在しません。そのため、リストに直接適用しようとすると以下のエラーになります。
setA = ["apple","orange","banana"]
setB = ["apple","lemon","orange","banana"]
setA.issubset(setB)
---------- #出力 ----------
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[7], line 3
1 setA = ["apple","orange","banana"]
2 setB = ["apple","lemon","orange","banana"]
----> 3 setA.issubset(setB)
AttributeError: 'list' object has no attribute 'issubset'
01-5.辞書型(dict型)
辞書型はkeyとそれに対応する値(value)の組み合わせが含まれているデータ型です。辞書型は{}で囲んで、キーと値のペアを:で区切って記述します。
item = {
"apple" : "200",
"lemon" : "300",
"banana" : "150"
}
print(item)
---------- #出力 ----------
{'apple': '200', 'lemon': '300', 'banana': '150'}
要素を取得する
辞書型(dict型)から要素を取得するには、キーを指定して取得します。
item = {
"apple" : "200",
"lemon" : "300",
"banana" : "150"
}
print(item["apple"])
---------- #出力 ----------
200
値を追加・更新する
要素を追加する際は「変数名[キー] = 値」で追加できます。
item = {
"apple" : "200",
"lemon" : "300",
"banana" : "150"
}
item["melon"] = "450"
print(item)
---------- #出力 ----------
{'apple': '200', 'lemon': '300', 'banana': '150', 'melon': '450'}
要素を更新する際も同じ要領で、「変数名[更新するキー] = 値」で追加できます。
item = {
"apple" : "200",
"lemon" : "300",
"banana" : "150"
}
item["apple"] = "150"
print(item)
---------- #出力 ----------
{'apple': '150', 'lemon': '300', 'banana': '150'}
要素を削除する
キーを削除する場合にはdel()を使用します。
item = {
"apple" : "200",
"lemon" : "300",
"banana" : "150"
}
del item["apple"]
print(item)
---------- #出力 ----------
{'lemon': '300', 'banana': '150'}
pop()を使用してキーを削除することも可能です。
item = {
"apple" : "200",
"lemon" : "300",
"banana" : "150"
}
item.pop("apple")
print(item)
---------- #出力 ----------
{'lemon': '300', 'banana': '150'}
指定したキーが存在しなかった場合はkeyerrorになります。引数に値を指定するとキーが存在しなかった場合に指定した値を返します。
item = {
item = {
"apple" : "200",
"lemon" : "300",
"banana" : "150"
}
item.pop("melon")
---------- #出力 ----------
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
Cell In[10], line 6
1 item = {
2 "apple" : "200",
3 "lemon" : "300",
4 "banana" : "150"
5 }
----> 6 item.pop("melon")
KeyError: 'melon'
item = {
"apple" : "200",
"lemon" : "300",
"banana" : "150"
}
item.pop("melon","Notfound")
---------- #出力 ----------
'Notfound'
clear()を使用すると辞書のすべての要素が削除できます。
item = {
"apple" : "150",
"lemon" : "200",
"banana" : "250"
}
item.clear()
print(item)
---------- #出力 ----------
{}
辞書のすべての要素を取得する
keys()を使用することで辞書に含まれるすべてのキーを取得できます。
item = {
"apple" : "150",
"lemon" : "200",
"banana" : "250"
}
item.keys()
---------- #出力 ----------
dict_keys(['apple', 'lemon', 'banana'])
values()を使用すると全ての値が取得できます。
item = {
"apple" : "150",
"lemon" : "200",
"banana" : "250"
}
item.values()
---------- #出力 ----------
dict_values(['150', '200', '250'])
items()を使用すると全てのキーと値をペアで取得できます。
item = {
"apple" : "150",
"lemon" : "200",
"banana" : "250"
}
item.items()
---------- #出力 ----------
dict_items([('apple', '150'), ('lemon', '200'), ('banana', '250')])
01-6. in 演算子
in 演算子を使用することでキーや値の存在を確認することができます。
item = {
"apple" : "150",
"lemon" : "200",
"banana" : "250"
}
print("lemon" in item)
---------- #出力 ----------
True