Pythonでリストのサイズ(要素数)を取得

Modified: | Tags: Python, リスト

Pythonでリスト(list型オブジェクト)のサイズ(要素数)を取得するには組み込み関数len()を使う。

len()で取得できるのはリストの全要素数。特定の値の要素の個数を取得したい場合はcount()メソッドか標準ライブラリcollectionsのCounterを使う。

リスト以外の型のオブジェクトに対するlen()の使い方は以下の記事を参照。

len関数でリストのサイズ(要素数)を取得

組み込み関数len()の引数にリストを渡すと、そのサイズ(要素数)が整数値で返される。

l = [0, 1, 2, 3]

print(len(l))
# 4
source: list_len.py

変数に代入してもいい。

l_length = len(l)

print(l_length)
# 4

print(type(l_length))
# <class 'int'>
source: list_len.py

二次元配列(リストのリスト)の場合

リストの要素としてリストを格納することで二次元配列構造を表現できる。

これをそのままlen()に渡すと、要素として格納されたリストの個数が返される。

l_2d = [[0, 1, 2], [3, 4, 5]]

print(len(l_2d))
# 2
source: list_len.py

各リストの要素数(各行の要素数)はリスト内包表記で取得できる。

print([len(v) for v in l_2d])
# [3, 3]
source: list_len.py

要素数の合計はsum()で算出可能。ここではリスト内包表記のジェネレータ版(ジェネレータ式)を使っている。ジェネレータ式は[]ではなく()で囲むが、この例のように()内で使うときは()を二重に書く必要はなくジェネレータ式の()は省略可能。

print(sum(len(v) for v in l_2d))
# 6
source: list_len.py

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)
source: list_len.py

サイズ(要素数)が異なるリストやリスト以外のオブジェクトを含む場合

サイズ(要素数)が異なるリストや、リスト以外のオブジェクトを含む、不規則なリストについて考える。

l_multi = [[0, 1, 2, [10, 20, 30]], [3, 4, 5], 100]
source: list_len.py

このようなリストを一次元に平坦化する方法については以下の記事を参照。

これをそのままlen()に渡すと、要素として格納されたオブジェクトの個数が返される。

print(len(l_multi))
# 3
source: list_len.py

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.
source: list_len.py

このようなリストの全要素数を取得するためには、再帰的にリストの要素数を算出する関数を定義する。

どのような形でリストがネストされていても全要素数がカウントされる。

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
source: list_len.py

isinstance()でオブジェクトがリスト型かどうかを判定している。

リスト以外のオブジェクトを渡すと1を返すので注意。

print(my_len(100))
# 1
source: list_len.py

リスト以外のオブジェクトに対して例えば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
source: list_len.py

関連カテゴリー

関連記事