Pythonでリストのサイズ(要素数)を取得
Pythonでリスト(list
型オブジェクト)のサイズ(要素数)を取得するには組み込み関数len()
を使う。
len()
で取得できるのはリストの全要素数。特定の値の要素の個数を取得したい場合はcount()
メソッドか標準ライブラリcollectionsのCounterを使う。
リスト以外の型のオブジェクトに対するlen()
の使い方は以下の記事を参照。
len関数でリストのサイズ(要素数)を取得
組み込み関数len()
の引数にリストを渡すと、そのサイズ(要素数)が整数値で返される。
l = [0, 1, 2, 3]
print(len(l))
# 4
変数に代入してもいい。
l_length = len(l)
print(l_length)
# 4
print(type(l_length))
# <class 'int'>
二次元配列(リストのリスト)の場合
リストの要素としてリストを格納することで二次元配列構造を表現できる。
これをそのままlen()
に渡すと、要素として格納されたリストの個数が返される。
l_2d = [[0, 1, 2], [3, 4, 5]]
print(len(l_2d))
# 2
各リストの要素数(各行の要素数)はリスト内包表記で取得できる。
- 関連記事: Pythonリスト内包表記の使い方
print([len(v) for v in l_2d])
# [3, 3]
要素数の合計はsum()
で算出可能。ここではリスト内包表記のジェネレータ版(ジェネレータ式)を使っている。ジェネレータ式は[]
ではなく()
で囲むが、この例のように()
内で使うときは()
を二重に書く必要はなくジェネレータ式の()
は省略可能。
print(sum(len(v) for v in l_2d))
# 6
NumPyがインストールされている環境であれば、NumPy配列ndarray
に変換してもよい。属性size
で全要素数、属性shape
で形状(行数、列数)が取得できる。
import numpy as np
l_2d = [[0, 1, 2], [3, 4, 5]]
arr_2d = np.array(l_2d)
print(arr_2d)
# [[0 1 2]
# [3 4 5]]
print(arr_2d.size)
# 6
print(arr_2d.shape)
# (2, 3)
サイズ(要素数)が異なるリストやリスト以外のオブジェクトを含む場合
サイズ(要素数)が異なるリストや、リスト以外のオブジェクトを含む、不規則なリストについて考える。
l_multi = [[0, 1, 2, [10, 20, 30]], [3, 4, 5], 100]
このようなリストを一次元に平坦化する方法については以下の記事を参照。
これをそのままlen()
に渡すと、要素として格納されたオブジェクトの個数が返される。
print(len(l_multi))
# 3
numpy.array()
に渡すとエラーになる(バージョン1.25.1
時点)。古いバージョンではリストを要素とするNumPy配列ndarray
が生成される場合もある。
# arr_multi = np.array(l_multi)
# ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions.
# The detected shape was (3,) + inhomogeneous part.
このようなリストの全要素数を取得するためには、再帰的にリストの要素数を算出する関数を定義する。
どのような形でリストがネストされていても全要素数がカウントされる。
def my_len(l):
count = 0
if isinstance(l, list):
for v in l:
count += my_len(v)
return count
else:
return 1
l_multi = [[0, 1, 2, [10, 20, 30]], [3, 4, 5], 100]
print(my_len(l_multi))
# 10
l_2d = [[0, 1, 2], [3, 4, 5]]
print(my_len(l_2d))
# 6
l = [0, 1, 2, 3]
print(my_len(l))
# 4
isinstance()
でオブジェクトがリスト型かどうかを判定している。
リスト以外のオブジェクトを渡すと1
を返すので注意。
print(my_len(100))
# 1
リスト以外のオブジェクトに対して例えばNone
を返すには、以下のようなラッパー関数を定義すればよい。
def my_len_wrapper(l):
if isinstance(l, list):
return my_len(l)
else:
return None
print(my_len_wrapper(l_multi))
# 10
print(my_len_wrapper(l_2d))
# 6
print(my_len_wrapper(l))
# 4
print(my_len_wrapper(100))
# None