Pythonで文字列の長さごとにリストをグループ化する方法
長さの異なる多数の文字列を含むリストを考えてみましょう。この記事では、同じ長さの文字列同士をまとめてグループ化する方法を、2つの異なるアプローチで解説します。
forループを使う方法
まずは基本的なforループによるアプローチです。リスト内の各要素を順番に走査し、その文字列の長さが既存のグループ内の要素と一致する場合にのみ、該当するグループへ追加していきます。
コード例
listA = ['Monday','Thursday','Friday','Saturday','Sunday']
# 元のリスト
print("Given list : \n",listA)
# 文字列の長さで分類する
len_comp = lambda x, y: len(x) == len(y)
res = []
for sub_list in listA:
ele = next((i for i in res if len_comp(sub_list, i[0])), [])
if ele == []:
res.append(ele)
ele.append(sub_list)
# 結果を出力
print("The list after creating categories : \n",res)実行結果
上記のコードを実行すると、以下のような出力が得られます。
Given list : ['Monday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] The list after creating categories : [['Monday', 'Friday', 'Sunday'], ['Thursday', 'Saturday']]
この例では、6文字の「Monday」「Friday」「Sunday」が1つのグループに、8文字の「Thursday」「Saturday」が別のグループに分類されています。lambda式で定義したlen_comp関数により、2つの文字列の長さが等しいかどうかを判定し、next()関数で一致する既存グループを探しています。見つからない場合は新しい空のリスト(グループ)を作成して追加します。
sortとgroupbyを使う方法
次に、より簡潔なアプローチをご紹介します。この方法では、まずすべての要素を文字列の長さを基準にソートし、その後、itertoolsモジュールに含まれるgroupby関数を適用してグループ化します。
コード例
from itertools import groupby
listA = ['Monday','Thursday','Friday','Saturday','Sunday']
# 元のリスト
print("Given list : \n",listA)
# 文字列の長さで分類する
get_len = lambda x: len(x)
sub_list = sorted(listA, key = get_len)
res = [list(ele) for i, ele in groupby(sub_list, get_len)]
# 結果を出力
print("The list after creating categories : \n",res)実行結果
上記のコードを実行すると、以下のような出力が得られます。
Given list : ['Monday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] The list after creating categories : [['Monday', 'Friday', 'Sunday'], ['Thursday', 'Saturday']]
このアプローチでは、sorted()関数のkey引数に文字列の長さを返すlambda関数を指定することで、リストを長さ順に並べ替えています。groupby関数は隣接する同一キーの要素をまとめるため、事前のソートが必須となる点に注意してください。最後にリスト内包表記で各グループをリスト形式に変換しています。
まとめ
どちらの方法でも同じ結果が得られますが、forループを使う方法は元のリストの順序をある程度保持できる一方、sortとgroupbyを使う方法はコードが簡潔でPythonらしい書き方と言えます。データ量や要件に応じて使い分けるとよいでしょう。
-
指定された文字列が母音回文であるかどうかを確認するPythonプログラム
はじめに この記事では、「与えられた文字列から子音をすべて取り除いたとき、残った母音だけの文字列が回文になっているかどうかを判定する」という問題を、Pythonプログラムで解く方法を解説します。 問題の概要 問題文:母音と子音の両方を含む文字列が与えられます。まず文字列からすべての子音を取り除き、その結果得られた文字列が回文(前から読んでも後ろから読んでも同じ並びになる文字列)であるかどうかを確認してください。 解決のアプローチ この問題は、以下の手順で解くことができます。 元の文字列を先頭から順に走査し、母音(a・e・i・o・u)だけを取り出して新しい文字列を作成します。 母音が1つも
-
Pythonで文字列がパングラムかどうかを判定するプログラムの作成方法
本記事では、与えられた文字列がパングラムであるかどうかを判定するPythonプログラムの解法とアプローチについて詳しく解説します。 問題の概要 文字列入力が与えられたとき、その文字列がパングラムであるかどうかを判定するPythonプログラムを作成します。 パングラムとは? パングラムとは、英語のアルファベット26文字すべてを少なくとも1回ずつ含む文章や一連の単語のことです。有名な例として「The quick brown fox jumps over the lazy dog」があります。 解法のアプローチ この問題は、以下の手順で解くことができます。 アルファベット全体を表す基準となる文字列