Pythonで文字列リストを部分文字列の範囲をキーに並べ替える方法
文字列のリストを「部分文字列の範囲」を基準に並べ替えたいケースがあります。たとえば、各文字列の2文字目から3文字目までを比較対象にしてソートするような場合です。Pythonでは、sort() メソッドの key 引数にスライス処理を行う関数を渡すことで、この要件をシンプルに実現できます。
サンプルコード
以下は、部分文字列の範囲をキーに文字列リストを並べ替える例です。
def get_substring(my_string):
return my_string[i : j]
my_list = ["python", 'is', 'fun', 'to', 'learn']
print("The list is :")
print(my_list)
i, j = 1, 3
print("The value of i and j are :")
print(str(i)+ ',' +str(j))
my_list.sort(key=get_substring)
print("The result is :")
print(my_list)
実行結果
The list is : ['python', 'is', 'fun', 'to', 'learn'] The value of i and j are : 1,3 The result is : ['learn', 'to', 'is', 'fun', 'python']
コードの解説
get_substringという名前の関数を定義し、引数として文字列を受け取ります。関数内では文字列のスライシングを使用し、指定した範囲
iからjまでの部分文字列を返します。関数の外側で、5つの文字列を含むリスト
my_listを定義し、コンソールに表示します。スライス範囲となる2つの変数
iとjに値を設定し、コンソールに表示します。ここではi=1、j=3です。sort()メソッドのkey引数に先ほど定義した関数を指定し、部分文字列を基準にリストを並べ替えます。並べ替え後のリストをコンソールに出力します。
動作のポイント
Pythonのスライス my_string[i:j] は、インデックス i 以上 j 未満の部分文字列を返します。今回の例(i=1、j=3)では、各文字列から取り出される比較キーは以下の通りです。
「python」→「yt」
「is」→「s」
「fun」→「un」
「to」→「o」
「learn」→「ea」
これらを辞書順に並べると「ea」「o」「s」「un」「yt」の順になるため、実行結果は ['learn', 'to', 'is', 'fun', 'python'] となります。
なお、同じ処理は lambda 式を使えば、関数を別途定義せずに次のように1行で書くこともできます。
my_list.sort(key=lambda s: s[i:j])
状況に応じて、再利用性を重視するなら通常の関数、簡潔さを重視するなら lambda を選ぶとよいでしょう。
-
Pythonでリストのすべてのサブリストを生成して出力する方法
リストが与えられたとき、そのリストに含まれるすべてのサブリスト(部分リスト)を生成して出力するプログラムを紹介します。要素数 n のリストの場合、空のリストを含めるとサブリストの総数は n×(n+1)/2+1 個になります。 実行例 入力 : list = [1, 2, 3] 出力 : [], [1], [1, 2], [1, 2, 3], [2], [2, 3], [3] アルゴリズム 考え方はシンプルです。開始位置 i と終了位置 j の組み合わせをすべて試し、スライスで部分リストを取り出します。 ステップ1 : 対象となるリストを用意します。 ステップ2 : 結果を格納するため、最
-
Pythonで文字列のリストを並べ替える方法:sort()とsorted()の使い分け
Pythonでは、文字列のリストを並べ替える方法が2つ用意されています。リスト自体を直接変更するsort()メソッドと、元のリストを保持したまま新しい並べ替え済みリストを作成するsorted()関数です。それぞれの特徴と使い方を解説します。 sort()メソッドでリストをその場で並べ替える sort()は、リストそのものを並べ替える「in-place(破壊的)」な操作です。元のリストの順序が直接変更されるため、戻り値を受け取る必要はありません。 >>> a = [Hello, My, Followers] >>> a.sort() >>>