Pythonで文字列リストから数値を抽出する2つの方法:splitとmap/isnumericの使い方
Pythonでデータ処理を行っていると、文字と数字が混在し、かつ一定のパターンを持つリストに遭遇することがあります。例えば「曜日-数値」のように、識別子と数値が組み合わされたデータは実務でもよく見られます。
本記事では、このようなリストから数値部分だけを抽出し、その後の計算や集計に利用できるようにする方法を、2つのアプローチで解説します。
方法1:split関数を使う
split() 関数は、指定した区切り文字を基準に文字列を分割します。以下の例では、リストの各要素がハイフン(-)によって文字部分と数値部分に区切られています。この特徴を利用し、リスト内包表記で各要素を処理することで、数値部分を効率的に取り出せます。
コード例
listA = ['Mon-2', 'Wed-8', 'Thu-2', 'Fri-7']
# 元のリスト
print("Given list : " + str(listA))
# 数値部分を抽出
num_list = [int(i.split('-')[1]) for i in listA]
# 結果を出力
print("List only with numbers : ", num_list)
実行結果
上記のコードを実行すると、次のような出力が得られます。
Given list : ['Mon-2', 'Wed-8', 'Thu-2', 'Fri-7'] List only with numbers : [2, 8, 2, 7]
この方法のポイントは i.split('-')[1] の部分です。ハイフンで分割した2番目の要素(インデックス1)を取得し、int() で整数型に変換しています。区切りの位置が固定されている場合は、最もシンプルで可読性の高い方法と言えます。
方法2:map関数とisnumericメソッドを組み合わせる
次に紹介するのは、map() 関数と isnumeric() メソッドを組み合わせた方法です。このアプローチでは、各文字列を1文字ずつ走査し、数値として判定できる文字のみを結合して抽出します。map() を使うことで、同一の処理をリスト内のすべての要素に対して一括で適用できます。
コード例
listA = ['Mon-2', 'Wed-8', 'Thu-2', 'Fri-7']
# 元のリスト
print("Given list : " + str(listA))
# 数値部分を抽出
num_list = list(map(lambda sub: int(''.join(
[i for i in sub if i.isnumeric()])), listA))
# 結果を出力
print("List only with numbers : ", num_list)
実行結果
上記のコードを実行すると、次のような出力が得られます。
Given list : ['Mon-2', 'Wed-8', 'Thu-2', 'Fri-7'] List only with numbers : [2, 8, 2, 7]
ラムダ式の中では、まずリスト内包表記で isnumeric() が True を返す文字だけを収集し、''.join() で連結した後に int() で整数へ変換しています。
どちらの方法を選ぶべきか?
両者の使い分けの目安は以下の通りです。
- splitを使う方法: 区切り文字の位置が固定されている場合に最適。コードが短く直感的で、処理速度も速い傾向があります。
- map+isnumericを使う方法: 数値の位置が不定だったり、区切り文字が複数種類ある場合にも対応可能。柔軟性が高いのが利点です。
なお、より複雑なパターンに対応したい場合は、正規表現モジュール re の re.findall(r'\d+', s) を使う方法も検討するとよいでしょう。
-
Pythonで文字列のリストを並べ替える方法:sort()とsorted()の使い分け
Pythonでは、文字列のリストを並べ替える方法が2つ用意されています。リスト自体を直接変更するsort()メソッドと、元のリストを保持したまま新しい並べ替え済みリストを作成するsorted()関数です。それぞれの特徴と使い方を解説します。 sort()メソッドでリストをその場で並べ替える sort()は、リストそのものを並べ替える「in-place(破壊的)」な操作です。元のリストの順序が直接変更されるため、戻り値を受け取る必要はありません。 >>> a = [Hello, My, Followers] >>> a.sort() >>>
-
Pythonで文字列から数字を抽出する方法【isdigitと正規表現の使い分け】
正の整数だけを抽出するシンプルな方法文字列に含まれる正の整数だけを取り出したい場合は、split()で空白ごとに文字列を分割し、isdigit()で各要素が数字のみで構成されているかを判定する方法が手軽です。>>> s = h3110 23 cat 444.4 rabbit 11 2 dog >>> [int(x) for x in s.split() if x.isdigit()] [23, 11, 2]この方法では、すべてが数字で構成された要素だけが整数に変換されてリストに追加されます。そのため「h3110」のように文字と数字が混ざった語句や、「444.