メインコンテンツにスキップ

Pythonのデータ型変換:例付きガイド

このPythonチュートリアルでは、コード例を通じて、プリミティブ型および非プリミティブ型のデータ構造における暗黙的・明示的なデータ型変換に取り組みます。
· 14 分 読む

AIで探求

Pythonのすべての値にはデータ型があります。データ型は、コンパイラやインタプリタに対して、そのデータをどのように使いたいかを伝えるデータの分類です。型は、そのデータに対して実行できる操作や、データを格納したい構造を定義します。データサイエンスでは、使いやすくするためにデータの型を変更する必要が頻繁にあります。

Pythonには多くのデータ型があります。すでにいくつかは見たり使ったりしているはずです。数値には整数型と浮動小数点型、真偽値にはブール型(bool)、英数字には文字列があります。複数の値をまとめて格納できるデータ構造として、リスト、タプル、辞書、セットも使用できます。詳しくは、DataCampのData Types in Pythonコースをご覧ください。

このチュートリアルのサンプルコードを手元で簡単に実行するには、無料でDataLabワークブックを作成してください。Pythonがあらかじめインストールされ、すべてのコードサンプルが含まれています。

Pythonでデータ型を確認する

データ型を変換する前に、型を確認しておくと便利です。Pythonには主に次の2つの関数があります。

  • type():変数の型を返します。
  • isinstance():変数が特定の型に属するかを確認します。
a = 5.5
print(type(a))  # Output: <class 'float'>

print(isinstance(a, int))  # Output: False
print(isinstance(a, float))  # Output: True

Pythonの暗黙的・明示的なデータ型変換

Pythonのデータ変換には2つの方法があります。コンパイラに対して、あるデータ型を別の型に変換するよう明示的に指示する方法と、コンパイラが自動的に理解して変換してくれる方法です。前者は明示的なデータ型変換、後者は暗黙的なデータ型変換と呼ばれます。

Pythonの暗黙的なデータ型変換

暗黙的変換(型強制)は、コンパイル時または実行時にデータ型の変換が行われ、Pythonが自動で処理するものです。例を見てみましょう。

a_int = 1
b_float = 1.0
c_sum = a_int + b_float
print(c_sum)
print(type(c_sum))
 2.0
<class 'float'>

ヒント:オブジェクトのデータ型を確認するには、Pythonのtype()関数を使えます。

この例では、整数値a_intに浮動小数点値b_floatを加算した結果が、コンパイラに指示しなくても自動的に浮動小数点値c_sumへ変換されました。これが暗黙的なデータ変換です。

では、なぜ浮動小数点が整数に変換されなかったのでしょうか?

これはコンピュータサイエンスの「型昇格」というより広い概念によるものです。簡単に言えば、情報を失わずにより広い型へ変換して、可能な限り演算を実行できるようにするコンパイラの防御的な仕組みです。

そのため、浮動小数点から整数への変換は行われません。そうすると小数部分を切り捨てる必要があり、情報が失われてしまうからです。

Pythonの明示的なデータ型変換

明示的なデータ型変換(型キャストとも呼ばれます)は、ある値を意図的に別のデータ型へ変換するものです。コードの中で変換先のデータ型を明示的に指定するため、変換を直接コントロールできます。Pythonが提供する自動(暗黙的)変換では要件を満たせない場合によく使われます。

明示的な変換の構文は次のとおりです。

target_data_type(expression)

たとえば、浮動小数点数を整数に変換したい場合は次のように書きます。

int(3.14)  # Converts 3.14 to 3

注意: 明示的な変換は非常に有用ですが、情報の損失を招くことがあります。例えば、浮動小数点数を整数に変換すると、小数部分は破棄されます。プログラムで意図しない結果を避けるために、こうした影響を理解しておくことが重要です。

ここからは、よく使われる明示的なデータ型変換をいくつか見ていきます。

Pythonのプリミティブ型と非プリミティブ型データ構造

プリミティブなデータ構造はデータ操作の基本要素で、純粋で単純なデータ値を扱います。Pythonには次の4つのプリミティブ変数型があります。

  • 整数
  • 浮動小数点数
  • 文字列
  • ブール値

非プリミティブなデータ構造は、単一の値ではなく、さまざまな形式の値の集合を格納します。Pythonには次の非プリミティブなデータ構造があります。

  • リスト
  • タプル
  • 辞書
  • セット

詳しくは、DataCampのData Structures in Python Tutorialをご覧ください。

プリミティブデータ構造の変換

Pythonの整数と浮動小数点の変換

整数と浮動小数点は数値を扱うデータ型です。

整数を浮動小数点に変換するには、Pythonのfloat()関数を使います。逆に、浮動小数点を整数に変換するにはint()関数を使います。

a_int = 3
b_int = 2

# Explicit type conversion from int to float
c_float_sum = float(a_int + b_int)
print(c_float_sum)
5.0
a_float = 3.3
b_float = 2.0
# Explicit type conversion from float to int
c_int_sum = int(a_float + b_float)
print(c_int_sum)

c_float_sum = a_float + b_float
print(c_float_sum)
5
5.3

浮動小数点の精度問題とDecimalモジュール

Pythonの浮動小数点演算では、精度の問題が生じることがあります。

print(0.1 + 0.2)  # Output: 0.30000000000000004

これを避けるには、Decimalモジュールを使います。

from decimal import Decimal

print(Decimal('0.1') + Decimal('0.2'))  # Output: 0.3

Pythonでの実数から複素数への変換

complex(real,imag)を使うと、整数を複素数に変換できます。実部と虚部の2つの整数を取り、実数を複素数へ変換します。

real = 2
imag = 5
print(complex(real, imag))
(2+5j)

Pythonにおける文字列を使ったデータ型変換

文字列は1文字以上(文字、数字、記号)の集まりです。文字列を数値に、あるいは数値を文字列に変換する必要は比較的よくあります。

price_cake = 15
price_cookie = 6
total = price_cake + price_cookie
print("The total is: " + total  + "$")

 
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-12-54bd76b9b4bd> in <module>()
      2 price_cookie = 6
      3 total = price_cake + price_cookie
----> 4 print("The total is: " + total  + "$")


TypeError: Can't convert 'int' object to str implicitly

上の例ではTypeErrorが発生し、コンパイラは整数値を暗黙的に文字列へ変換できないことを知らせています。

この場面でプログラムが何をすべきかは直感的に思えるかもしれません。しかし、コンパイラが常に確信を持てるとは限らないため、明示的な型キャストの仕組みを用意しており、意図を明確に示せます。Pythonではstr()関数で整数を文字列に変換できます。

price_cake = 15
price_cookie = 6
total = price_cake + price_cookie
print("The total is: " + str(total)  + "$")
The total is: 21$

浮動小数点から文字列への変換でも同様に機能します。

またPythonでは、可能な場合に文字列を整数や浮動小数点に変換することもできます。次の例で確認しましょう。

price_cake = '15'
price_cookie = '6'

# String concatenation
total = price_cake + price_cookie
print("The total is: " + total + "$")

# Explicit type conversion to integer
total = int(price_cake) + int(price_cookie)
print("The total is: " + str(total)  + "$")
The total is: 156$
The total is: 21$

コードを分解して見てみましょう。

price_cakeとprice_cookieは最初は文字列です。合計を求めるには、まず対応する整数値に変換する必要があります。そうしないと、コンパイラは数値の加算ではなく、文字列の連結を行おうとします。最後に表示用の文字列にこの値を入れるため、合計を文字列に変換してメッセージと連結する必要があります。

この例から、データ型変換の重要性がわかるはずです。ごく小さな例でも、どれほど有用かが見て取れます。

注意:「文字列を整数や浮動小数点に変換できるのは『可能な場合』」と述べたのに気づきましたか?これは、文字列を数値に変換して数値演算を適用できない場合があるからです。コンパイラはそれを認識しており、試みるとエラーを出します。次の例を確認してください。

price_cake = 'fifteen'
price_cookie = 'six'
total = int(price_cake) + int(price_cookie)
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-25-80591b8accda> in <module>()
      1 price_cake = 'fifteen'
      2 price_cookie = 'six'
----> 3 total = int(price_cake) + int(price_cookie)


ValueError: invalid literal for int() with base 10: 'fifteen'

まとめ:Pythonのプリミティブなデータ型変換

変換関数例出力
整数から浮動小数点float()float(3)3.0
浮動小数点から整数int()int(3.9)3
文字列から整数int()int('123')123
整数から文字列str()str(123)'123'

非プリミティブなデータ構造の変換

Pythonでタプルとリストへ型変換

整数や浮動小数点と同様に、リストからタプル、タプルからリストへの変換も可能です。

タプルとリストを覚えていますか?Pythonのリストとタプルは、同種の要素の集まりを格納するために使われます。違いは、タプルはイミュータブル(不変)で、一度定義すると中の値を削除・追加・編集できない点です。

なぜリストをタプルに変換するのでしょうか?

タプルはイミュータブルなデータ型であり、プログラムの最適化に大きく寄与できるからです。

では、なぜタプルをリストに変換するのでしょうか?

元のタプルに変更を加えたい場合があるからです。いったんリストに変換して変更し、その後タプルに戻すことができます。

Pythonでは、tuple()関数で渡した値のタプル版を返し、同様にlist()関数でタプルをリストに変換できます。

a_tuple = ('a', 1) ,('f', 2), ('g', 3)
b_list = [1,2,3,4,5]

print(tuple(b_list))
print(list(a_tuple))
(1, 2, 3, 4, 5)
[('a', 1), ('f', 2), ('g', 3)]

同様に、文字列をリストやタプルに変換する方法は次のとおりです。

dessert = 'Cake'

# Convert the characters in a string to individual items in a tuple
print(tuple(dessert))

# Convert a string into a list
dessert_list = list(dessert)
dessert_list.append('s')
print(dessert_list)
('C', 'a', 'k', 'e')
['C', 'a', 'k', 'e', 's']

Pythonで辞書とセットへの型変換

dict()関数でタプルを辞書に、set()でリストをセットに変換できます。

print(dict(a_tuple))
print(set(b_list))
{'a': 1, 'f': 2, 'g': 3}
{1, 2, 3, 4, 5}

他の変換関数と同様に、適切な関数名を指定するだけで、任意のデータ型を辞書やセットに変換できます。

構造化データにはdataclassesを活用(Python 3.7+)

辞書やタプルの代わりに、dataclassesは構造化データを扱う優れた方法を提供します。

from dataclasses import dataclass

@dataclass
class Product:
    name: str
    price: float
    in_stock: bool

item = Product("Laptop", 799.99, True)
print(item)  # Output: Product(name='Laptop', price=799.99, in_stock=True)

まとめ:Pythonの非プリミティブなデータ構造の変換

変換関数例出力
リストからタプルtuple()tuple([1, 2, 3])(1, 2, 3)
タプルからリストlist()list(('a', 1))['a', 1]
文字列からリストlist()list('Cake')['C', 'a', 'k', 'e']
文字列からタプルtuple()tuple('Cake')('C', 'a', 'k', 'e')
タプルから辞書dict()dict((('a', 1), ('b', 2))){'a': 1, 'b': 2}
リストからセットset()set([1, 2, 3, 4, 5]){1, 2, 3, 4, 5}

Unicode、2進数、8進数、16進数の整数(Python)

数値体系とは、数値を表すための記号(文字)の種類数を指します。日常的に使うのは10進法で、0〜9の10種類の記号を使ってあらゆる量を表現します。Unicode、2進数、16進数、8進数は、それぞれ異なる数値体系を指します。

記号が尽きると、次の桁に繰り上がります。10進法では、9の次を表すには10を使い、これは「十の位が1つ、1の位が0つ」を意味します。他の体系では異なります。例えば、記号が0と1の2つしかない2進法では、記号が尽きるたびに次の桁に進みます。よって2進数では 0, 1, 10, 11, 100, 101, ... と数えます。

以下のセクションで、いくつかの数値体系を詳しく見ていきましょう。

Pythonで2進数を10進数に変換する

2進整数は基数2で表される数です。つまり、2進数では0と1の2つの記号だけで数を表します。0から数え始めるとすぐに記号が尽きます:0, 1, ???

それ以上の記号はありません。2という桁には進みません。2進法には2が存在しないからです。代わりに1と0の組み合わせを使います。2進数の1000は10進数の8に等しく、2の累乗を用います。つまり8は(1(2^3)) + (0(2^2)) + (0(2^1)) + (0(2^0)) = 8 のように表せます。1や0の位置が、2を何乗するかを決めます。

より複雑な例で確認しましょう。

Binary Number = 1001111
Decimal value = (1*(2^6)) + (0*(2^5)) + (0*(2^4)) + (1*(2^3)) + (1*(2^2)) + (1*(2^1)) + (1*(2^0))
              = 79

Pythonでは、bin()関数で10進数から対応する2進表現に変換できます。

同様に、int()関数で2進数を10進数に変換できます。int()の第2引数に変換元の基数を渡し、2進数の場合は2を指定します。

a = 79

# Base 2(binary)
bin_a = bin(a)
print(bin_a)
print(int(bin_a, 2)) #Base 2(binary)
0b1001111
79

Pythonで8進数を10進数に変換する

8進法は、日常の10進法よりも記号が少ない別の数値体系です。基数8で、0〜7の8つの記号を使います。7の次は8ではなく10になります(8は存在しないため)。

2進法で2の累乗を使ったのと同様に、8進法では基数が8なので8の累乗を使います。

8進数では10は10進数の8に等しく、(1(8^1)) + (0(8^0)) = 8 と表せます。

より複雑な例:

Octal Number = 117
Decimal value = (1*(8^2)) + (1*(8^1)) + (7*(8^0))
              = 79

Pythonでは、oct()関数で10進数から対応する8進表現に変換できます。あるいはint()関数に基数8を指定して8進数を10進数に変換できます。

a = 79

# Base 8(octal)
oct_a = oct(a)
print(oct_a)
print(int(oct_a, 8))
0o117
79

Pythonで16進数を10進数に変換する

16進法は基数16の体系です。2進法や8進法と異なり、10進法の数字に加えて6つの記号を追加で使用します。

では9の次は?

通常の数字に加えて、必要な記号はアルファベットを用います。16進法では、0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F を使います。

先ほどと同じ例を用いると:

Hexadecimal Number = 4F
Decimal value = (4*(16^1)) + (F*(16^0))
              = 79

Pythonでは、hex()関数で10進数から対応する16進表現に変換できます。16進数から10進数にするには、int()関数に基数16を指定します。

a = 79

# Base 16(hexadecimal)
hex_a = hex(a)
print(hex_a)
print(int(hex_a, 16))
0x4f
79

Unicodeを文字に変換する

Pythonのchr()は、Unicode整数を文字列に変換します。Unicodeは、多様な言語の文字を表示するために広く受け入れられている文字コードです。

chr()関数に複数のUnicode整数を与えて「DATACAMP」を表示しています。ord()を使うと、単一の文字をUnicode整数に変換できます。

print(
    chr(68),
    chr(65),
    chr(84),
    chr(65),
    chr(67),
    chr(65),
    chr(77),
    chr(80),
)
D A T A C A M P

まとめ:Pythonの数値体系の変換

変換関数例出力
10進数から2進数bin()bin(79)0b1001111
2進数から10進数int()int('1001111', 2)79
10進数から8進数oct()oct(79)0o117
8進数から10進数int()int('117', 8)79
10進数から16進数hex()hex(79)0x4f
16進数から10進数int()int('4F', 16)79
Unicodeから文字chr()chr(68)'D'
文字からUnicodeord()ord('D')68

お疲れさまでした!

おめでとうございます。Pythonにおけるデータ型変換を、主に組み込みメソッドを使って学びました。これにより、さまざまなデータ型を柔軟に扱えるようになり、プログラム作成の幅が広がります。

DataCampのIntermediate Python for Data Scienceコースでは、matplotlibを使ったデータの可視化、辞書や有名なpandas DataFrameの操作、ループによる制御フローなどを学べます。コースの最後にはケーススタディがあり、学んだ内容を実践できます。

FAQs

Pythonで整数のリストを1つの文字列に変換するには?

map()で各整数を文字列に変換し、join()で連結します。

int_list = [1, 2, 3, 4]
result = ''.join(map(str, int_list))
print(result)  # Output: '1234'
数値でない文字列を整数に変換しようとするとどうなりますか?

ValueErrorが発生し、その文字列が有効な整数ではないことが示されます。

int('abc')  # Raises ValueError: invalid literal for int() with base 10: 'abc'
Pythonでセットをリストに変換できますか?方法は?

はい、list()関数を使ってセットをリストに変換できます。

a_set = {1, 2, 3}
a_list = list(a_set)
print(a_list)  # Output: [1, 2, 3]
空白区切りの数字文字列を整数のリストに変換するには?

split()で文字列を分割し、map()で各要素を整数に変換します。

numbers = "1 2 3 4"
int_list = list(map(int, numbers.split()))
print(int_list)  # Output: [1, 2, 3, 4]
Pythonで変数のデータ型を確認するにはどの関数を使いますか?

変数のデータ型を確認するにはtype()関数を使えます。

x = 5
print(type(x))  # Output: <class 'int'>

トピック