Pythonでリストの要素数を取得することはよくある操作です。
例えば、リストを反復処理するときに、そのリストがいくつの要素を持っているかを知る必要があります。
リストは、整数、浮動小数点数、文字列、ブーリアン、他のリストなどを組み合わせて要素として持つことができることを覚えておいてください。
# List of just integers
list_a = [12, 5, 91, 18]
# List of integers, floats, strings, booleans
list_b = [4, 1.2, "hello world", True]
list_aの要素を数えると、全体で 5 個の要素になります。
同じことをlist_b` について行えば、4つの要素が得られます。
リストの要素数を求めるには、さまざまな方法があります。
ネストしたリストを1つの要素として数えるのか、ネストしたリスト内のすべての要素を数えるのか、ユニークな要素だけに興味があるのか、などアプローチは様々です。
組込み関数 len()
リストの要素数を取得する最も簡単な方法は、Python のビルトイン関数 len()
を使うことです。
次の例を見てみましょう。
list_a = ["Hello", 2, 15, "World", 34]
number_of_elements = len(list_a)
print("Number of elements in the list: ", number_of_elements)
これは次のようにプリントアウトされます。
Number of elements in the list: 5
関数名が示すように、 len()
はリストに含まれる要素の種類に関係なく、その長さを返します。
forループの使用
もうひとつの方法は、for
ループを使ってリストをループする関数を作成することです。
まず、要素のカウントを0に初期化し、ループの反復処理が行われるたびにカウントを1ずつ増やしていく。
ループはすべての要素に対して繰り返されたときに終了するので、countはリスト内の要素の総数を表すことになります。
list_c = [20, 8.9, "Hi", 0, "word", "name"]
def get_number_of_elements(list):
count = 0
for element in list:
count += 1
return count
print("Number of elements in the list: ", get_number_of_elements(list_c))
このコードを実行すると、次のように表示される。
Number of elements in the list: 6
これは len()
関数と比べるとかなり冗長な処理ですが、この記事の後半でリストのリストを扱うときに同じ考え方が適用できることがわかるので、見てみる価値はあるでしょう。
さらに、要素そのものや一般的な操作のいずれかに対して何らかの操作を行いたいと思うかもしれませんが、ここではそれが可能です。
リスト内のユニークな要素数の取得
リストは、重複を含む複数の要素を持つことができます。
もし、重複のない要素 (ユニークな要素) の数を取得したい場合は、別の組み込み関数 set()
を使用します。
この関数は set
オブジェクトを生成し、重複する値をすべて取り除きます。
そして、それを len()
関数に渡すと、 set
に含まれる要素の数が求められます。
list_d = [100, 3, 100, "c", 100, 7.9, "c", 15]
number_of_elements = len(list_d)
number_of_unique_elements = len(set(list_d))
print("Number of elements in the list: ", number_of_elements)
print("Number of unique elements in the list: ", number_of_unique_elements)
と表示されます。
Number of elements in the list: 8
Number of unique elements in the list: 5
list_d` には合計で 8 個の要素があり、そのうち 5 個は一意であることがわかります。
len() を用いたリストの一覧表
冒頭で、リストの要素は異なるデータ型になりうることを確認しました。
しかし、リストはその要素として、順番にリストを持つことができます。
list_e = [[90, 4, 12, 2], [], [34, 45, 2], [9,4], "char", [7, 3, 19]]
ビルトイン関数 len()
を使うと、リストは1つの要素としてカウントされるので、次のようになります。
number_of_elements = len(list_e)
print("Number of elements in the list of lists: ", number_of_elements)
と表示されます。
Number of elements in the list of lists: 6
空のリストは1つの要素とみなされることに注意してください。
もし、リストの中のリストが複数の要素を含んでいたとしても、それは考慮されません。
ここで、for
ループが役に立ちます。
他のリストを含むリストの要素数を取得する
他のリストを含むリスト内のすべての要素をカウントしたい場合、 for
ループを使用します。
変数 count
を 0 で初期化し、リスト内をループします。
ループを繰り返すたびに、 count
はリストの長さだけ増加します。
ここでは、組み込み関数 len()
を使って長さを取得します。
list_e = [[90, 4, 12, 2], [], [34, 45, 2], [9,4], "char", [7, 3, 19]]
def get_all_elements_in_list_of_lists(list):
count = 0
for element in list_e:
count += len(element)
return count
print("Total number of elements in the list of lists: ", get_all_elements_in_list_of_lists(list_e))
出力は次のようになります。
Total number of elements in the list of lists: 16
この例では、いくつかの重要な点に注意する必要があります。
まず、今回は空リストが総数に影響を与えなかったことです。
これは、すべてのループで現在のネストされたリストの長さを考慮し、空のリストの長さは0であるため、count
は0だけ増加するからです。
しかし、文字列 "char"
のすべての文字が要素の総数にカウントされるのがわかるでしょう。
これは、 len()
関数が文字列に対して、そのすべての文字を返すように動作しているからです。
この状況を避けるには、以下のセクションと同じ方法を使えば、リスト以外の要素も持つことができます。
前の例と同じことをするもう一つの楽しい方法は、リスト内包を使うことです。
number_of_elements = sum([len(element) for element in list_e])
この行は本質的に2つのことをします。
まず、元のリストのすべての要素の長さを含む新しいリストを作成します。
この例では、[4, 0, 3, 2, 4, 3]
ということになります。
次に、新しく生成されたリストをパラメータとして sum()
関数を呼び出し、すべての要素の合計を返し、望みの結果を得ます。
ネストされたリスト
ネストされたリストとは、他のリストの要素であるリストのことです。
リストの内部には、複数のレベルのリストが存在することがあります。
list_f = [30, 0.9, [8, 56, 22, ["a", "b"]], [200, 3, [5, [89], 10]]]
a”, “b”]はリスト
[8, 56, 22, [“a”, “b”]]に含まれ、そのリストはメインリスト
[30, 0.9,[200, 3, [5, [89], 10]] ` に含まれることがわかります。
ここでも、変数 count
を 0 に初期化しています。
ネストしたリストの全体の要素数を取得したい場合には、まず、要素がリストであるかどうかをチェックする必要があります。
リストであれば、リスト内部をループし、ネストされたリストがなくなるまで再帰的に関数を呼び出します。
リスト以外の要素(整数、文字列など)はすべてカウントが1増えることになる。
これは、先ほどの手法で発生した問題の解決策でもあることに注意しましょう。
それでは、ネストされたリストの要素をカウントするコードを見てみよう。
list_f = [30, 0.9, [8, 56, 22, ["a", "hello"]], [200, 3, [5, [89], 10]]]
def get_elements_of_nested_list(element):
count = 0
if isinstance(element, list):
for each_element in element:
count += get_elements_of_nested_list(each_element)
else:
count += 1
return count
print("Total number of elements in the nested list: ", get_elements_of_nested_list(list_f))
このコードを実行すると、次のようになる。
Total number of elements in the nested list: 12
最初の引数が2番目の引数として与えられたクラスのインスタンスであるかどうかをチェックする組み込み関数 isinstance()
を使用したことに注意してください。
上の関数では、要素がリストであるかどうかをチェックします。
最初の要素 30
は整数なので、関数は else
ブロックにジャンプしてカウントを 1 つ増やします。
8, 56, 22, [“a”, “hello”]]` に到達すると、関数はリストを認識し、再帰的に他のリストをチェックします。
結論
リストの種類によって、要素の数を取得する方法が異なることを確認しました。
平らなリストであれば len()
が最も早く、最もシンプルな関数です。
リストの中のリストやネストされたリストでは、 len()
はリスト内の要素をカウントしません。
そのためには、リスト全体をループする必要があります。