Pythonで連続する要素のべき乗の合計を求める方法
連続する要素のべき乗の合計とは
リスト内に同じ値が連続して現れるとき、各連続グループごとに「その要素を出現回数でべき乗した値」を計算し、全体の合計を求める処理です。Pythonでは、if文による隣接要素の比較、シンプルな反復処理、そしてべき乗演算を行う**演算子を組み合わせることで実装できます。
たとえば [21, 21, 23, 23, 45, 45, 45, 56, 56, 67] の場合、「21」が2個連続しているので 21²=441、「23」も2個なので 23²=529、「45」は3個なので 45³=91125、「56」は2個なので 56²=3136、最後の「67」は1個なので 67¹=67 となります。これらをすべて足すと 95298 が答えです。
サンプルコード
以下に具体的な実装例を示します。
my_list = [21, 21, 23, 23, 45, 45, 45, 56, 56, 67]
print("The list is :")
print(my_list)
my_freq = 1
my_result = 0
for index in range(0, len(my_list) - 1):
if my_list[index] != my_list[index + 1]:
my_result = my_result + my_list[index] ** my_freq
my_freq = 1
else:
my_freq += 1
my_result = my_result + my_list[len(my_list) - 1] ** my_freq
print("The resultant value is :")
print(my_result)
実行結果
The list is : [21, 21, 23, 23, 45, 45, 45, 56, 56, 67] The resultant value is : 95298
コードの解説
- 対象となるリストを定義し、コンソールに表示します。
- 連続出現回数を記録する変数
my_freqを 1 で初期化し、合計値を格納するmy_resultを 0 で初期化します。 forループでリストを先頭から順に走査し、現在の要素と次の要素を比較します。- 両者の値が異なる場合(=連続グループの切れ目)は、現在の要素を
my_freq乗した値をmy_resultに加算し、my_freqを 1 に戻します。 - 両者の値が等しい場合は、
my_freqを 1 増やして連続回数をカウントします。 - ループを抜けた後、比較相手が存在しない最後の要素についても同様にべき乗して加算します。
- 最終的な
my_resultの値が結果としてコンソールに出力されます。
補足:itertools.groupbyを使った別解
標準ライブラリの itertools.groupby を利用すると、連続する同一要素のグループ化を自動的に行えるため、より簡潔に記述できます。
from itertools import groupby my_list = [21, 21, 23, 23, 45, 45, 45, 56, 56, 67] my_result = sum(value ** len(list(group)) for value, group in groupby(my_list)) print(my_result)
groupby は隣接する同じ値をひとつのグループにまとめてくれるため、頻度管理用の変数や条件分岐が不要になり、コードの意図が明確になります。実行結果は先ほどの例と同じく 95298 です。
-
Pythonで最も頻出する上位K個の要素を求めるアルゴリズムを解説
問題概要 空ではない整数型の配列が与えられたとき、その中で最も頻繁に出現する上位k個の要素を返すことを考えます。 例えば、要素が [1,1,1,1,2,2,3,3,3] で k = 2 の場合、結果は [1, 3] となります。 解法のアプローチ この問題は、ハッシュマップ(辞書)を2つ使うことで効率的に解くことができます。全体の流れは以下の通りです。 出現回数の記録: 各数値の出現回数を最初のマップに記録します。 頻度ごとのグループ化: 「出現回数」をキー、「その回数で出現した数値のリスト」を値とする2つ目のマップを作成します。 頻度の高い順に抽出: 配列の長さから降順にループし、該当する
-
Pythonで整数が3の累乗かどうかを判定する方法
ある整数 n が与えられたとき、その数が 3 の累乗(べき乗)であるかどうかを判定する問題を考えてみましょう。例えば、n = 27 は 3 の累乗なので結果は true、一方 n = 15 は 3 の累乗ではないため false となります。この記事では、対数(ログ)を活用したシンプルで効率的な判定方法を解説します。解法のアプローチ:対数を使うこの問題は、以下の手順で解くことができます。常用対数(log10)を利用して判定を行う[log10(n) ÷ log10(3)] の計算結果の小数部分が 0(つまり結果が整数)であれば、n は 3 の累乗であると判定できるこの方法が成り立つ理由は、対数の