HOWTO · Python
Python で文字列のリストを整数に変換する
このチュートリアルでは、Python で文字列のリストを整数に変換する方法を示します。
このページの内容
数値を表す文字列は int() で整数のリストに変換できます。基本の方法には簡潔なリスト内包表記が便利です。map() や for ループも選択肢になります。配列を使う場合は、すでにプロジェクトでそのライブラリを使用していれば、NumPy で値を変換できます。以下の例では一貫した入力データを使います。提供された実行結果では、変換後の値は [12, 7, 50, 92] です。
文字列のリストを整数に変換する
各文字列は、int() で変換できる整数を表している必要があります。たとえば、"12" や "-4" のような文字列です。変換すると整数値になるため、文字列を繰り返し解析せずに算術演算に使えます。単純な変換にはリスト内包表記、反復可能オブジェクトの各要素に関数を適用するには map()、各要素に追加の処理が必要な場合はループを選びます。
リスト内包表記を使う
リスト内包表記を使うと、変換と結果の収集を読みやすい1つの式で表せます。次の例を実行します。
このセクションのコードと表示されるラベルや出力は英語のままです。
values = ["12", "7", "50", "92"]
integers = [int(value) for value in values]
print(integers)
[12, 7, 50, 92]
新しいリストが作られ、values は変更されません。list comprehension はメソッドではなく、Pythonの言語構文です。すべての入力を変換し、処理が単純な場合に適した基本の方法です。
map() を使う
map() は各要素に int() を適用します。Python 3ではイテレータを返すため、結果をリストとして使ったり表示したりするには list() で囲みます。
このセクションのコードと表示されるラベルや出力は英語のままです。
values = ["12", "7", "50", "92"]
integers = list(map(int, values))
print(integers)
[12, 7, 50, 92]
この方法の変換動作は、前の例と同じです。イテレータは値を1つずつ処理するときに便利ですが、反復するにつれて要素が消費されます。再利用できるリストが必要な場合は、リストに変換してください。通常の変換では、関数を使う方法とリスト内包表記のどちらも分かりやすい選択肢です。
for ループを使う
ループを使うと各処理が明示されます。変換に要素ごとの処理が必要な場合、たとえば変換に失敗した元の値を記録する場合に便利です。変換した値を結果リストに追加します。
このセクションのコードと表示されるラベルや出力は英語のままです。
values = ["12", "7", "50", "92"]
integers = []
for value in values:
integers.append(int(value))
print(integers)
[12, 7, 50, 92]
1行の内包表記では重要な処理が分かりにくくなる場合に、この方法を使います。単純に変換するだけなら、内包表記のほうが短く書けます。
NumPy で文字列を変換する
プロジェクトですでに NumPy を使っていて、数値計算用の配列が必要な場合は、整数型を指定して文字列を変換できます。次の例は NumPy をインポートし、入力を定義して、変換後の配列を表示する一通りのコードです。実行する環境に NumPy がインストールされている必要があります。
このセクションのコードと表示されるラベルや出力は英語のままです。
try:
import numpy as np
except ImportError:
print("Install NumPy to run this example.")
else:
values = ["12", "7", "50", "92"]
integers = np.array(values, dtype=int)
print(integers)
結果はPythonのリストではなく、NumPy の整数配列です。周辺の処理で NumPy の配列演算が必要な場合に、この方法を使います。性能やメモリ使用量はデータの大きさや処理内容によって異なるため、速度を比較する前に自分のケースで測定してください。
変換できない値を処理する
"seven" のような文字列は整数を表していないため、int() は ValueError を発生させます。そのような値が入力に含まれる可能性がある場合は、各値の変換を例外処理で囲み、その値をスキップするか、報告するか、処理を中止するかを決めます。たとえば、次のコードでは有効な整数を集め、変換できなかった文字列を記録します。
このセクションのコードと表示されるラベルや出力は英語のままです。
values = ["12", "seven", "50"]
integers = []
rejected = []
for value in values:
try:
integers.append(int(value))
except ValueError:
rejected.append(value)
print(integers)
print(rejected)
[12, 50]
['seven']
予期している変換エラーだけを処理してください。ValueError を捕捉すれば、関係のないプログラミングエラーを見逃さずに済みます。すべての値が有効でなければならない場合は、例外をそのまま伝播させるほうが、不正な入力に気づきやすくなります。アプリケーションに合った箇所で、変換できなかった値を検証または報告してください。
小数表記の文字列と混在する値を変換する
int() が受け付けるのは整数形式の文字列であり、"3.8" のような小数表記ではありません。小数部分を切り捨てるのが意図した動作であれば、float() で変換してから int() を使います。
このセクションのコードと表示されるラベルや出力は英語のままです。
values = ["3.8", "-2.4"]
integers = [int(float(value)) for value in values]
print(integers)
[3, -2]
int への変換では、最も近い整数に丸めるのではなく、ゼロに向かって小数部分を切り捨てます。丸めが必要な場合は、明示的な丸め規則を選んで適用してください。また、非常に大きな小数表記の文字列を浮動小数点数経由で変換すると、精度に限界が生じることにも注意してください。
整数と数値文字列がすでに混在しているリストでは、文字列だけを変換します。
values = [12, "7", 50]
integers = [int(value) if isinstance(value, str) else value for value in values]
print(integers)
[12, 7, 50]
既存の整数は整数のまま保ち、文字列を解析できます。ただし、この判定だけで任意のオブジェクトや不正な文字列まで安全に扱えるわけではありません。実際の入力を検証し、信頼できない値が含まれる可能性がある場合は ValueError を処理してください。リストの要素がすでにすべて整数なら、変換は不要です。