【Python】len()関数を使わずにリストの長さを求めるプログラムの書き方
Pythonでは通常、リストの長さを取得する際に組み込み関数の len() を使用します。しかし、状況によっては len() や size() といった長さを返す関数を一切使わずに、リストの要素数を求めなければならないケースがあります。
例えば、次のようなリストが与えられた場合を考えてみましょう。
nums = [5, 7, 6, 4, 6, 9, 3, 6, 2]
このリストには9個の要素が含まれているため、期待される出力は「9」です。本記事では、len() を使わずにこの値を求める方法を解説します。
解決のアプローチ:map()とsum()を活用する
len() を使用しない代わりに、map() 関数と sum() 関数を組み合わせることで、リストの長さを効率的に求めることができます。手順は以下の通りです。
- map()とリスト操作で問題を解く:
map()を使って各要素を処理します。 - すべての要素を1に変換する:匿名関数(ラムダ式)を定義し、リスト内のどの要素も一律に「1」へ変換します。
- sum()で合計を計算する:すべての要素が1になった状態で
sum()を呼び出すことで、「1」の個数=元のリストの要素数が得られます。
つまり、各要素を1に置き換えてから合計を取るという発想です。リストの要素1つにつき1がカウントされるため、その合計値がそのままリストの長さになります。
実装例
それでは、実際のコードを見てみましょう。
def solve(nums): return sum(map(lambda x: 1, nums)) nums = [5, 7, 6, 4, 6, 9, 3, 6, 2] print(solve(nums))
コードの解説
map(lambda x: 1, nums) の部分では、リスト nums の各要素に対してラムダ式 lambda x: 1 を適用し、すべての要素を1に変換しています。その結果に対して sum() を実行することで、要素の総数(この場合は9)が返されます。
入力
[5, 7, 6, 4, 6, 9, 3, 6, 2]
出力
9
まとめ
この方法を使えば、len() などの長さ取得関数に頼らずとも、map() と sum() の組み合わせだけでリストの要素数を正確に求めることができます。シンプルでありながら、Pythonの関数型プログラミング的な書き方を学ぶ良い例と言えるでしょう。
-
Pythonで重なる区間をマージし、最長の区間の長さを求めるプログラム
問題の概要それぞれ [start, end] の形式で表される区間(インターバル)のリストが与えられているとします。この課題では、重なり合う区間をいくつでもマージ(統合)して作ることができる「最も長い区間」の長さを求めます。例えば、入力が [[1, 6], [4, 9], [5, 6], [11, 14], [16, 20]] の場合を考えてみましょう。[1, 6]、[4, 9]、[5, 6] は互いに重なっているため、これらをマージすると長さ9の区間 [1, 9] が得られます。したがって、出力は 9 となります。解法のアルゴリズムこの問題は、以下の手順で効率よく解くことができます。区間のリ
-
Pythonで最長連続シーケンスの長さを求めるアルゴリズムと実装方法
問題概要ソートされていない数値の配列が与えられたとき、その中から連続する要素で構成される最長シーケンスの長さを見つける問題を考えてみましょう。ここでいう「連続」とは、値が1ずつ増えていく数列(例:4, 5, 6, 7)のことを指します。例えば、入力が nums = [70, 7, 50, 4, 6, 5] の場合、最も長い連続シーケンスは [4, 5, 6, 7] となるため、答えは 4 になります。解法のアプローチこの問題は、以下の手順で効率的に解くことができます。まず、配列をセット(set)に変換して重複を除去します。これにより、要素の存在確認が O(1) で行えるようになります。各要素