Pythonでリスト内の連続する文字列要素をグループ化する方法
リスト内に連続して現れる文字列要素をひとつのグループにまとめたい場合、groupbyとyieldを利用したメソッドを定義することで簡単に実現できます。
サンプルコード
以下に具体的な実装例を示します。
from itertools import groupby
def string_check(elem):
return isinstance(elem, str)
def group_string(my_list):
for key, grp in groupby(my_list, key=string_check):
if key:
yield list(grp)
else:
yield from grp
my_list = [52, 11, 'py', 'th', 'on', 11, 52, 'i', 's', 18, 'f', 'un', 99]
print("The list is :")
print(my_list)
my_result = [*group_string(my_list)]
print("The result is:")
print(my_result)実行結果
The list is : [52, 11, 'py', 'th', 'on', 11, 52, 'i', 's', 18, 'f', 'un', 99] The result is: [52, 11, ['py', 'th', 'on'], 11, 52, ['i', 's'], 18, ['f', 'un'], 99]
コードの解説
まず「string_check」という関数を定義します。引数として受け取った要素が文字列型(str)かどうかを
isinstanceで判定し、真偽値を返します。次に「group_string」という関数を定義します。この関数はリストを引数に取り、itertoolsモジュールの
groupbyを使って隣接する同種の要素をグループ化し、yieldによって結果を順次返します。文字列のグループはリストとしてまとめられ、それ以外の要素はそのままその場で返されます。関数の外側では、整数と文字列が混在したリストを定義し、コンソールに表示しています。
「group_string」を呼び出し、アンパック演算子
*を使ってジェネレータの全要素をリスト化し、変数に代入します。最後に、処理結果をコンソールに出力します。
ポイント
itertools.groupbyは「連続している」同じキーを持つ要素だけをまとめるという特徴がある点に注意してください。リスト全体から同種の要素をすべて集めたい場合は、事前にsorted()などで並べ替えてからグループ化する必要があります。
-
Pythonで文字列リストから数値を抽出する2つの方法:splitとmap/isnumericの使い方
Pythonでデータ処理を行っていると、文字と数字が混在し、かつ一定のパターンを持つリストに遭遇することがあります。例えば「曜日-数値」のように、識別子と数値が組み合わされたデータは実務でもよく見られます。 本記事では、このようなリストから数値部分だけを抽出し、その後の計算や集計に利用できるようにする方法を、2つのアプローチで解説します。 方法1:split関数を使う split() 関数は、指定した区切り文字を基準に文字列を分割します。以下の例では、リストの各要素がハイフン(-)によって文字部分と数値部分に区切られています。この特徴を利用し、リスト内包表記で各要素を処理することで、数値部分を
-
Pythonで文字列のリストを並べ替える方法:sort()とsorted()の使い分け
Pythonでは、文字列のリストを並べ替える方法が2つ用意されています。リスト自体を直接変更するsort()メソッドと、元のリストを保持したまま新しい並べ替え済みリストを作成するsorted()関数です。それぞれの特徴と使い方を解説します。 sort()メソッドでリストをその場で並べ替える sort()は、リストそのものを並べ替える「in-place(破壊的)」な操作です。元のリストの順序が直接変更されるため、戻り値を受け取る必要はありません。 >>> a = [Hello, My, Followers] >>> a.sort() >>>