Pythonでリストから最も長い単語を上位k個抽出する2つの方法
プログラミングでは、長さの異なる多数の単語が含まれるリストの中から、上位n個の最も長い単語を取り出したい場面があります。本記事では、このような処理を実現するための2つのアプローチを、サンプルコードと実行結果とともにわかりやすく解説します。
方法1:count()とsorted()を使う方法
まず、リストの要素を逆順にソートすることで、最も長い単語がリストの先頭に並ぶようにします。次に各単語の長さを求め、そのカウント結果を変数に格納します。最後に、必要な件数分だけスライスして、最長の単語を取得します。
ここで使われているitertools.count()は無限に増加するカウンターを生成するイテレータです。キー関数が(単語の長さ, カウンター値)というタプルを返すことで、同じ長さの単語同士は元のリスト内での順序(出現順)が維持されるようになっています。これにより、安定した予測可能な結果が得られます。
サンプルコード
from itertools import count
def longwords(l, x):
c = count()
return sorted(l, key=lambda i: (len(i), next(c)),
reverse=True)[:x]
listA = ['Earth','Moonshine','Aurora','Snowflakes','Sunshine']
n = 2
print(longwords(listA, n))実行結果
上記のコードを実行すると、以下の出力が得られます。
['Snowflakes', 'Moonshine']
方法2:zipとenumerateを使う方法
このアプローチでは、まずenumerate()を使ってリストの各要素にインデックスを付けて列挙します。その後、sorted()関数とzip()関数を組み合わせてカウントを取得します。キー関数に負の長さの値(-len(i[1]))を指定することで降順ソートを実現しており、同じ長さの場合はインデックスの負の値(-i[0])によって元の順序が保たれます。最後に、必要な件数分だけスライスします。
サンプルコード
def longwords(l, x):
idx, words = zip(*sorted(enumerate(l),
key = lambda i: (-len(i[1]), -i[0]))[:x])
return list(words)
listA = ['Earth','Moonshine','Aurora','Snowflakes','Sunshine']
n = 2
print(longwords(listA, n))実行結果
上記のコードを実行すると、以下の出力が得られます。
['Snowflakes', 'Moonshine']
まとめ
どちらの方法でも、リストから最も長い単語を上位n個正しく抽出できます。itertools.count()を使う方法はコードが簡潔で読みやすい一方、enumerate()とzip()を組み合わせる方法はインデックス情報も同時に扱えるため、単語だけでなくその位置情報も必要な場合に便利です。用途に応じて使い分けるとよいでしょう。
-
【初心者向け】Pythonでリストのサイズ(要素数)を取得する方法
リスト(list)は、Pythonにおける代表的なコレクション型のデータ構造の一つです。リストの要素は後から変更でき、重複した値を持つこともできます。本記事では、Pythonでリストのサイズ(長さ)を取得する方法を解説します。具体的には、重複の有無にかかわらず、リストに含まれる全要素の数をカウントする方法を紹介します。リストの長さを取得する基本:len()関数Pythonでリストの要素数を取得するには、組み込み関数の len() を使用します。len() はリストだけでなく、タプル・文字列・辞書などさまざまなコレクションに対しても利用できる汎用的な関数です。サンプルコード以下の例では、「day
-
Pythonでリストの平均値を求める方法
Pythonには、複数の要素の合計を簡単に計算できる組み込み関数 sum() が用意されています。ここでは、この関数を使ってリスト内のすべての数値の合計を求め、その後、合計を要素数で割ることで平均値を計算します。 アルゴリズム ステップ1:「リストのサイズ」を入力する ステップ2:「要素」を入力する ステップ3:sum関数を使用して、すべての数値の合計を計算する ステップ4:平均値を計算する サンプルコード # リストの平均値を求める A=list() n=int(input(Enter the size of the List ::)) print(Enter the number :