【Python入門】型変換をやさしく解説!文字列・数値・リストの変換方法まとめ

Python(パイソン)では「型(タイプ)」がとても重要です。

文字列・整数・リストなど、さまざまな型が存在し、それぞれに特徴があります。

ですが、実際の開発では「数値を文字列に変えたい」「文字列をリストに分解したい」といった型変換が頻繁に必要になります。

この記事では、Pythonにおける基本的な型変換の方法と注意点を、初心者にもわかりやすく解説します。

スポンサーリンク

型とは何か?

型の基本概念

とは、値が持つデータの種類のことです。

身近な例で考えてみよう:

  • には「小説」「辞書」「写真集」などの種類がある
  • 食べ物には「野菜」「肉」「果物」などの種類がある
  • データにも「数字」「文字」「記号」などの種類がある

この「データの種類」がPythonでは「型」と呼ばれます。

Pythonの主要な型

型名英語名説明
整数int小数点がない数字123, -5, 0
小数float小数点がある数字3.14, -2.5, 0.0
文字列str文字の集まり"Python", 'こんにちは'
真偽値bool正しいか間違いかTrue, False
リストlistデータの集まり[1, 2, 3], ['a', 'b']

型を確認する方法

# type()関数で型を確認できる
print(type(123))        # <class 'int'>
print(type(3.14))       # <class 'float'>
print(type("Python"))   # <class 'str'>
print(type(True))       # <class 'bool'>
print(type([1, 2, 3]))  # <class 'list'>

型が重要な理由

# 同じ「+」でも、型によって動作が変わる
print(1 + 2)        # 3(数値の足し算)
print("1" + "2")    # "12"(文字列の結合)

# これはエラーになる
# print(1 + "2")    # TypeError: 異なる型は計算できない

問題: 数字と文字列を一緒に計算したい場合はどうする? 解決: 型変換を使って、同じ型に揃える!

この章のまとめ

型はPythonの基本中の基本です。次は、それぞれの型への変換方法を具体的に見ていきましょう。

よく使う型変換一覧

型変換とは?

型変換とは、あるデータを別の型に変えることです。

身近な例:

  • 漢数字「三」を算用数字「3」に変える
  • ローマ字「san」をひらがな「さん」に変える
  • データも同じように「”123″」を123に変える

基本的な変換関数

変換先関数名使用例結果
整数int()int("100")100
小数float()float("3.14")3.14
文字列str()str(123)"123"
リストlist()list("abc")['a', 'b', 'c']
真偽値bool()bool(0)False

詳しい変換例

1. int():整数への変換

# 文字列から整数へ
print(int("123"))      # 123
print(int("-456"))     # -456

# 小数から整数へ(小数部分は切り捨て)
print(int(3.14))       # 3
print(int(9.99))       # 9

# 真偽値から整数へ
print(int(True))       # 1
print(int(False))      # 0

2. float():小数への変換

# 文字列から小数へ
print(float("3.14"))   # 3.14
print(float("123"))    # 123.0

# 整数から小数へ
print(float(42))       # 42.0

# 真偽値から小数へ
print(float(True))     # 1.0
print(float(False))    # 0.0

3. str():文字列への変換

# 数値から文字列へ
print(str(123))        # "123"
print(str(3.14))       # "3.14"

# 真偽値から文字列へ
print(str(True))       # "True"
print(str(False))      # "False"

# リストから文字列へ
print(str([1, 2, 3]))  # "[1, 2, 3]"

4. list():リストへの変換

# 文字列からリストへ(1文字ずつ分解)
print(list("Python"))  # ['P', 'y', 't', 'h', 'o', 'n']
print(list("こんにちは"))  # ['こ', 'ん', 'に', 'ち', 'は']

# range()からリストへ
print(list(range(5)))  # [0, 1, 2, 3, 4]

5. bool():真偽値への変換

# 数値から真偽値へ(0だけがFalse、それ以外はTrue)
print(bool(0))         # False
print(bool(1))         # True
print(bool(-1))        # True
print(bool(100))       # True

# 文字列から真偽値へ(空文字だけがFalse)
print(bool(""))        # False
print(bool("Python"))  # True
print(bool(" "))       # True(空白も文字)

# リストから真偽値へ(空リストだけがFalse)
print(bool([]))        # False
print(bool([1, 2]))    # True

注意点

変換できない場合はエラーになります:

# これらはエラーになる
# int("abc")        # ValueError: 文字が数字でない
# float("hello")    # ValueError: 文字が数字でない  
# list(123)         # TypeError: 整数はイテラブルでない

この章のまとめ

標準の変換関数を使えば、型を簡単に変えることができます。次は、実践的な使い方を例で紹介します。

実践!型変換の使い方

実例1:ユーザー入力の処理

# input()は必ず文字列を返すので、数値計算には変換が必要
age_str = input("年齢を入力してください: ")  # "25" と入力
age = int(age_str)  # 文字列を整数に変換

# 計算ができるようになる
next_year_age = age + 1
print(f"来年は{next_year_age}歳ですね")

実例2:価格計算(文字列→数値)

# 商品価格の計算
price_str = "300"  # 文字列として保存されている価格
tax_rate = 0.1     # 消費税率

# 文字列を数値に変換してから計算
price = int(price_str)
total = price * (1 + tax_rate)

print(f"税込価格: {total}円")  # 税込価格: 330.0円

実例3:メッセージ作成(数値→文字列)

# 数値を文字列に変換してメッセージを作成
age = 25
score = 95

# 方法1:str()を使って結合
message1 = "私は" + str(age) + "歳で、テストは" + str(score) + "点でした"
print(message1)

# 方法2:f文字列を使う(推奨)
message2 = f"私は{age}歳で、テストは{score}点でした"
print(message2)

実例4:文字列の分解(文字列→リスト)

# 文字列を1文字ずつリストに分解
word = "Python"
char_list = list(word)
print(char_list)  # ['P', 'y', 't', 'h', 'o', 'n']

# 各文字を処理
for i, char in enumerate(char_list):
    print(f"{i+1}文字目: {char}")

実例5:CSVデータの処理

# カンマ区切りの文字列を処理
csv_data = "太郎,25,東京"

# split()でリストに分割
data_list = csv_data.split(",")
print(data_list)  # ['太郎', '25', '東京']

# 必要に応じて型変換
name = data_list[0]        # 文字列のまま
age = int(data_list[1])    # 文字列を整数に変換
city = data_list[2]        # 文字列のまま

print(f"名前: {name}, 年齢: {age}, 住所: {city}")

実例6:真偽値の活用

# ユーザー設定の処理
settings = {
    "notifications": "1",   # 文字列で保存
    "dark_mode": "0",      # 文字列で保存
}

# 文字列を真偽値に変換
notifications_on = bool(int(settings["notifications"]))
dark_mode_on = bool(int(settings["dark_mode"]))

print(f"通知: {notifications_on}")    # True
print(f"ダークモード: {dark_mode_on}")  # False

実例7:リストから文字列への変換

# リストの要素を結合して文字列にする
fruits = ["りんご", "バナナ", "みかん"]

# join()を使って結合
result1 = ", ".join(fruits)
print(result1)  # "りんご, バナナ, みかん"

# 数値のリストの場合は、まず文字列に変換
numbers = [1, 2, 3, 4, 5]
str_numbers = [str(num) for num in numbers]  # リスト内包表記
result2 = "-".join(str_numbers)
print(result2)  # "1-2-3-4-5"

この章のまとめ

実際の開発では、複数の型変換を組み合わせて使うことが多いです。次は、型変換の落とし穴について紹介します。

型変換でよくあるエラーと対策

よくあるエラーパターン

エラー1:数字でない文字列を数値に変換

# ❌ エラーになる例
user_input = "abc"
# number = int(user_input)  # ValueError が発生

# ✅ 対策1:事前チェック
user_input = "abc"
if user_input.isdigit():
    number = int(user_input)
else:
    print("数字を入力してください")
    number = 0

print(number)  # 0

エラー2:小数点の表記ミス

# ❌ エラーになる例
# float("10,5")    # ValueError: カンマは使えない
# float("10.5.5")  # ValueError: 小数点が複数

# ✅ 対策:文字列を修正してから変換
price_str = "1,250.50"  # カンマ付きの価格
clean_price = price_str.replace(",", "")  # カンマを削除
price = float(clean_price)
print(price)  # 1250.5

エラー3:リスト変換の失敗

# ❌ エラーになる例
# list(123)  # TypeError: 整数はイテラブルでない

# ✅ 対策:適切なデータ型を使用
number = 123

# 数字を1桁ずつリストにしたい場合
digits = [int(d) for d in str(number)]
print(digits)  # [1, 2, 3]

# 数字を要素とするリストを作りたい場合
number_list = [number]
print(number_list)  # [123]

安全な型変換の方法

1. try-except構文を使う

def safe_int_conversion(value):
    """安全に整数変換を行う関数"""
    try:
        return int(value)
    except ValueError:
        print(f"'{value}' は整数に変換できません")
        return 0
    except TypeError:
        print(f"'{value}' は変換できない型です")
        return 0

# テスト
print(safe_int_conversion("123"))     # 123
print(safe_int_conversion("abc"))     # 0(エラーメッセージ付き)
print(safe_int_conversion([1, 2]))    # 0(エラーメッセージ付き)

2. デフォルト値を設定する

def convert_with_default(value, target_type, default):
    """デフォルト値付きの型変換"""
    try:
        return target_type(value)
    except (ValueError, TypeError):
        return default

# 使用例
age = convert_with_default("25", int, 0)      # 25
age = convert_with_default("abc", int, 0)     # 0
price = convert_with_default("3.14", float, 0.0)  # 3.14

3. バリデーション関数を作る

def validate_and_convert(value, target_type):
    """値を検証してから変換"""
    if target_type == int:
        if isinstance(value, str) and value.isdigit():
            return int(value)
        elif isinstance(value, (int, float)):
            return int(value)
    
    elif target_type == float:
        try:
            return float(value)
        except (ValueError, TypeError):
            pass
    
    elif target_type == str:
        return str(value)
    
    # 変換できない場合
    raise ValueError(f"'{value}' を {target_type.__name__} に変換できません")

# 使用例
try:
    result = validate_and_convert("123", int)
    print(result)  # 123
except ValueError as e:
    print(e)

実用的なエラー処理例

ユーザー入力の処理

def get_user_age():
    """ユーザーから年齢を安全に取得"""
    while True:
        age_input = input("年齢を入力してください: ")
        
        try:
            age = int(age_input)
            if age < 0:
                print("年齢は0以上で入力してください")
                continue
            elif age > 150:
                print("年齢は150以下で入力してください")
                continue
            return age
        
        except ValueError:
            print("数字で入力してください")

# 使用例
# user_age = get_user_age()
# print(f"あなたは{user_age}歳ですね")

ファイル読み込みでの型変換

def process_score_file(filename):
    """点数ファイルを読み込んで処理"""
    scores = []
    
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            for line_num, line in enumerate(file, 1):
                line = line.strip()
                if not line:  # 空行をスキップ
                    continue
                
                try:
                    score = float(line)
                    if 0 <= score <= 100:
                        scores.append(score)
                    else:
                        print(f"行{line_num}: {score} は範囲外です(0-100)")
                except ValueError:
                    print(f"行{line_num}: '{line}' は数値ではありません")
    
    except FileNotFoundError:
        print(f"ファイル '{filename}' が見つかりません")
        return []
    
    return scores

# 使用例
# scores = process_score_file('scores.txt')
# if scores:
#     print(f"平均点: {sum(scores) / len(scores):.1f}")

この章のまとめ

型変換は非常に便利ですが、誤って使うとエラーの原因になります。安全に扱うための工夫も覚えておきましょう。

応用テクニック

複数の型変換を組み合わせる

1. データクリーニング

def clean_and_convert_data(data_list):
    """汚いデータをクリーニングして変換"""
    cleaned_data = []
    
    for item in data_list:
        # 文字列に変換
        item_str = str(item).strip()
        
        # 空文字や None をスキップ
        if not item_str or item_str.lower() == 'none':
            continue
        
        # 数値として解釈できるかチェック
        try:
            # 整数として解釈
            if '.' not in item_str:
                cleaned_data.append(int(item_str))
            else:
                # 小数として解釈
                cleaned_data.append(float(item_str))
        except ValueError:
            # 文字列として保持
            cleaned_data.append(item_str)
    
    return cleaned_data

# テスト
messy_data = [" 123 ", "45.6", "hello", "", None, "789"]
clean_data = clean_and_convert_data(messy_data)
print(clean_data)  # [123, 45.6, 'hello', 789]

2. 設定ファイルの処理

def parse_config(config_text):
    """設定テキストを解析して適切な型に変換"""
    config = {}
    
    for line in config_text.strip().split('\n'):
        if '=' not in line or line.startswith('#'):
            continue
        
        key, value = line.split('=', 1)
        key = key.strip()
        value = value.strip()
        
        # 型の推定と変換
        if value.lower() in ('true', 'false'):
            config[key] = value.lower() == 'true'
        elif value.isdigit():
            config[key] = int(value)
        elif value.replace('.', '').isdigit() and value.count('.') == 1:
            config[key] = float(value)
        else:
            config[key] = value
    
    return config

# テスト
config_text = """
# アプリケーション設定
debug=true
port=8080
host=localhost
timeout=30.5
"""

config = parse_config(config_text)
print(config)
# {'debug': True, 'port': 8080, 'host': 'localhost', 'timeout': 30.5}

カスタム変換関数

日本語数字の変換

def japanese_to_int(japanese_num):
    """日本語の数字を整数に変換"""
    conversion_map = {
        '一': 1, '二': 2, '三': 3, '四': 4, '五': 5,
        '六': 6, '七': 7, '八': 8, '九': 9, '十': 10,
        '百': 100, '千': 1000, '万': 10000
    }
    
    if japanese_num in conversion_map:
        return conversion_map[japanese_num]
    
    # より複雑な変換ロジックをここに実装
    # 簡単な例として「十五」→ 15 の変換
    if japanese_num == '十五':
        return 15
    
    return None

# テスト
print(japanese_to_int('五'))    # 5
print(japanese_to_int('十'))    # 10
print(japanese_to_int('十五'))  # 15

パフォーマンス最適化

大量データの効率的な変換

import time

def compare_conversion_methods():
    """異なる変換方法のパフォーマンス比較"""
    data = ['123', '456', '789'] * 100000  # 30万件のデータ
    
    # 方法1:通常のfor文
    start = time.time()
    result1 = []
    for item in data:
        result1.append(int(item))
    time1 = time.time() - start
    
    # 方法2:リスト内包表記
    start = time.time()
    result2 = [int(item) for item in data]
    time2 = time.time() - start
    
    # 方法3:map関数
    start = time.time()
    result3 = list(map(int, data))
    time3 = time.time() - start
    
    print(f"for文: {time1:.3f}秒")
    print(f"リスト内包表記: {time2:.3f}秒")
    print(f"map関数: {time3:.3f}秒")

# compare_conversion_methods()

まとめ

重要ポイント

Pythonの型変換は、データ処理に欠かせないテクニックです。

  • int(), float(), str() などの標準関数で変換できる
  • 実際のコードで組み合わせて活用する
  • エラー対策も忘れずに
  • 安全な変換のためにtry-except構文を活用

型変換のベストプラクティス

1. 適切な関数を選ぶ

目的推奨方法理由
文字列→整数int()最も直接的
文字列→小数float()精度を保持
数値→文字列str() または f文字列読みやすい
文字列→リストlist() または split()用途に応じて

2. エラーハンドリングを忘れない

# ❌ 悪い例
def bad_conversion(value):
    return int(value)  # エラーが起きる可能性

# ✅ 良い例
def good_conversion(value, default=0):
    try:
        return int(value)
    except (ValueError, TypeError):
        return default

3. 可読性を重視する

# ❌ 悪い例(何をしているかわからない)
result = str(int(float(input())))

# ✅ 良い例(段階的で理解しやすい)
user_input = input("数値を入力: ")
number_float = float(user_input)
number_int = int(number_float)
result = str(number_int)

覚えておきたい型変換パターン

よく使う変換

  1. ユーザー入力の処理input()int() または float()
  2. メッセージ作成:数値 → str() → 文字列結合
  3. データファイル処理:文字列 → 適切な型
  4. 設定値の処理:文字列 → bool()

注意が必要な変換

  1. 文字列→数値:無効な文字列でエラー
  2. 小数→整数:情報の損失
  3. リスト→文字列join()を使う
  4. None値の処理:事前チェック必須

コメント

タイトルとURLをコピーしました