Pythonのデータ型まとめ。リスト・タプル・辞書の使い分けと数値型・丸め処理・JSON

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)0round(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の文字列操作まとめを参考にしてください。

技術ブログ一覧へ戻る