Python
 Computer >> コンピューター >  >> プログラミング >> Python

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らしい書き方と言えます。データ量や要件に応じて使い分けるとよいでしょう。

  1. 指定された文字列が母音回文であるかどうかを確認するPythonプログラム

    はじめに この記事では、「与えられた文字列から子音をすべて取り除いたとき、残った母音だけの文字列が回文になっているかどうかを判定する」という問題を、Pythonプログラムで解く方法を解説します。 問題の概要 問題文:母音と子音の両方を含む文字列が与えられます。まず文字列からすべての子音を取り除き、その結果得られた文字列が回文(前から読んでも後ろから読んでも同じ並びになる文字列)であるかどうかを確認してください。 解決のアプローチ この問題は、以下の手順で解くことができます。 元の文字列を先頭から順に走査し、母音(a・e・i・o・u)だけを取り出して新しい文字列を作成します。 母音が1つも

  2. Pythonで文字列がパングラムかどうかを判定するプログラムの作成方法

    本記事では、与えられた文字列がパングラムであるかどうかを判定するPythonプログラムの解法とアプローチについて詳しく解説します。 問題の概要 文字列入力が与えられたとき、その文字列がパングラムであるかどうかを判定するPythonプログラムを作成します。 パングラムとは? パングラムとは、英語のアルファベット26文字すべてを少なくとも1回ずつ含む文章や一連の単語のことです。有名な例として「The quick brown fox jumps over the lazy dog」があります。 解法のアプローチ この問題は、以下の手順で解くことができます。 アルファベット全体を表す基準となる文字列