Pythonのデータ型まとめ。リスト・タプル・辞書の使い分けと数値型・丸め処理・JSON
Pythonの基本データ型を、この記事1本にまとめて解説します。
- コレクション: リスト・タプル・辞書の違いと使い分け
- 数値型: int・float・複素数の扱いと型変換
- 丸め処理: 四捨五入・切り捨て・切り上げ
- JSON: 辞書⇔JSONの読み込み・書き込み
リストとは?
リストは要素の追加・削除・変更ができる配列型のデータです。[データ1, データ2, ...] の形式で書き、添え字(インデックス)で要素にアクセスできます。
listnum = ['apple', 'orange']
# 要素の追加
listnum.append('banana')
print(listnum)
# ['apple', 'orange', 'banana']
# 要素の削除
listnum.remove('apple')
print(listnum)
# ['orange', 'banana']
# リスト同士の連結
listnum2 = ['apple', 'orange'] + ['banana']
print(listnum2)
# ['apple', 'orange', 'banana']
スライスを使うと部分的に取り出せます。
listnum = [1, 2, 3, 4, 5]
print(listnum[2:4]) # [3, 4]
print(listnum[2:]) # [3, 4, 5]
print(listnum[:4]) # [1, 2, 3, 4]
参考: データ構造(公式チュートリアル)
タプルとは?
タプルはリストと違い、後から要素を追加・削除・変更できない固定のシーケンスです。(データ1, データ2, ...) の形式で書きます。
tuple1 = ('hi', 'my', 'name', 'is', 'apple')
print(tuple1)
# ('hi', 'my', 'name', 'is', 'apple')
要素が1つの場合は、末尾のカンマが必要な点に注意してください。
tuple2 = (1,) # これはタプル
notuple = (1) # これはただの整数
変更されては困るデータや、順番・内容が固定のデータに使います。リストよりもアクセスが高速で、辞書のキーにも使えます。
参考: 組み込み型 tuple
辞書型データとは?
辞書はキーと値のペアでデータを管理する型です。{key1: 値1, key2: 値2, ...} の形式で書き、キーでアクセスするためデータの意味が分かりやすくなります。
mydict = {"fruit": "apple", "number": 1}
print(mydict)
# {'fruit': 'apple', 'number': 1}
print(mydict["fruit"])
# apple
参考: マッピング型 dict
リスト・タプル・辞書の使い分け
| 型 | 変更 | アクセス | 使いどころ |
|---|---|---|---|
| リスト | 追加・削除・変更可 | 添え字 | キー管理が不要で、データの増減・変更があるもの |
| タプル | 不可(固定) | 添え字 | 変更されては困る固定データ。アクセスが高速 |
| 辞書 | 追加・削除・変更可 | キー | キーでデータを管理し、分かりやすくアクセスしたいもの |
整数(int型)の扱い方と変換
Python 3の整数はすべてint型で、メモリが許す限り最大値・最小値の制限はありません。
プラットフォームのワードサイズに由来する値は sys.maxsize で確認できます(64bit環境では 2^63 - 1)。
import sys
print(sys.maxsize)
# 9223372036854775807
文字列からint型への変換には int 関数を使います。
a = '110'
b = int(a)
print(b, type(b))
# 110 <class 'int'>
浮動小数点数(float型)の扱い方と変換
小数はfloat型に格納されます。明示的な型指定は不要です。
floatnum = 1.4
print(type(floatnum))
# <class 'float'>
文字列・int型からの変換には float 関数を使います。
print(float('1.4')) # 1.4
print(float(1)) # 1.0
Pythonにも浮動小数点誤差は存在します。 format で内部表現を確認すると分かります。
print(format(1.4, '.30f'))
# 1.399999999999999911182158029987
金額計算など誤差が許されない場合は decimal モジュールの利用を検討してください。
複素数(complex型)
複素数はcomplex型として実装されており、虚数単位は j で表現します。
complexnum = 1 + 2j
print(complexnum, type(complexnum))
# (1+2j) <class 'complex'>
係数が1でも 1j と書く必要があります(1 + j は変数 j の参照とみなされ NameError になります)。
四捨五入・切り捨て・切り上げ
四捨五入は組み込み関数、切り捨て・切り上げはmathライブラリを使う点に注意してください。
四捨五入:round()
round(数値, 桁数) で丸めます。桁数を指定しないと整数に丸められます。
value = 99.563
print(round(value)) # 100
print(round(value, 1)) # 99.6
print(round(value, 2)) # 99.56
なお round は「銀行丸め(偶数丸め)」のため、ちょうど0.5の値は最も近い偶数へ丸められます(round(0.5) は 0、round(2.5) は 2)。学校で習う四捨五入と結果が異なるケースがある点に注意してください。
切り捨て:math.floor()
import math
value = 99.563
print(math.floor(value)) # 99
floor は「床」を意味します。特定の桁数での切り捨てには、10のべき乗を掛けて割るなどの処理が必要です。
切り上げ:math.ceil()
import math
value = 99.563
print(math.ceil(value)) # 100
ceil は「天井」を意味します。こちらも特定の桁数での切り上げには追加の処理が必要です。
JSONの読み込み・書き込み
設定ファイルやAPIのデータなど、ちょっとしたデータを扱うのに便利なのがJSON(JavaScript Object Notation)です。Pythonでは標準の json ライブラリでエンコード・デコードでき、読み込んだJSONは辞書型データになります。
JSON文字列の読み込み:json.loads
文字列からの読み込みは json.loads(sはstringの意味)を使います。
import json
json_string = """
{
"name": "Yamada Taro",
"address": "yamadataro@example.com"
}
"""
json_dict = json.loads(json_string)
print(json_dict["name"]) # Yamada Taro
print(json_dict["address"]) # yamadataro@example.com
JSONファイルの読み込み:json.load
ファイルからの読み込みは、sの付かない json.load にファイルオブジェクトをそのまま渡します。
import json
with open("sample.json", "r", encoding="utf-8") as jsonfile:
json_dict = json.load(jsonfile)
print(json_dict["name"])
json.loads(文字列用)にファイルオブジェクトを渡すと、次のエラーになります。使い分けに注意してください。
TypeError: the JSON object must be str, bytes or bytearray, not 'TextIOWrapper'
JSONファイルへの書き込み:json.dump
辞書型データをJSONファイルへ書き込むには json.dump を使います。
import json
data = {
"name": "Yamada Taro",
"address": "yamadataro@example.com",
}
with open("test.json", "w", encoding="utf-8") as jsonfile:
json.dump(data, jsonfile, ensure_ascii=False, indent=2)
ensure_ascii=False を指定すると日本語がそのまま出力され、indent を指定すると人間が読みやすい整形になります。文字列としてJSONを得たい場合は json.dumps(data) を使います。
まとめ
| やりたいこと | 方法 |
|---|---|
| 増減するデータの管理 | リスト [...] |
| 固定データの管理 | タプル (...) |
| キーでのデータ管理 | 辞書 {key: value} |
| 型変換 | int() / float() / str() |
| 四捨五入 | round()(偶数丸めに注意) |
| 切り捨て / 切り上げ | math.floor() / math.ceil() |
| JSON読み込み | json.loads()(文字列)/ json.load()(ファイル) |
| JSON書き込み | json.dumps()(文字列)/ json.dump()(ファイル) |
文字列の操作はPythonの文字列操作まとめを参考にしてください。