環境設定 数値 文字列 正規表現 リスト タプル 集合 辞書 ループ 関数 クラス データクラス 時間 パス ファイル スクレイピング その他

Pythonのリストの要素数(長さ)をlenで求める:リストがリストを含むときの要素数を再帰的に計算してみよう

最終更新日 2023.02.18

Python のリストの要素数(長さ)は len で表します。

a = [1, 2, 3, 4, 5]
b = ['apple', 'grape', 'lemon']
c = [['a'], [1, 2, 3]]

l_a = len(a)
l_b = len(b)
l_c = len(c)

print(l_a)  # 5
print(l_b)  # 3
print(l_c)  # 2

len は文字列や数値のリストだけでなく、一般的なオブジェクト(インスタンス)やリストそのものを要素とするリストにも使えます。リスト c の長さが 2 になっていることに注意してください。

リストの要素にリストがあっても、子リストの要素数は関係ありません。

オブジェクトがリストの要素になっているとき

オブジェクト(インスタンス)が要素のリストも len で要素数を取得できます。

class Car:
    def __init__(self, size):
        self.size = size


a = Car(4)
b = Car(5)

x = [a, b]

print(len(x))  # 2

空リストを要素とするリストの要素数

Python のプログラマーが気にするところは、空リストを含むリストの長さです。

x = [[], 1, 2]

print(len(x))  # 3

この例でわかるように、空のリストは一つの要素としてカウントされます。空だろうがなかろうが、リストは一つのオブジェクトです。

ネストがあるリストの全要素を再帰的にカウントする

リストの要素にリストがあるとき、その長さは「リストを直接構成する要素の個数」となります。子リストの要素を再帰的にカウントしたいときは、自前で関数を用意する必要があります。

def re_len(a):
    return sum(re_len(b) if isinstance(b, list) else 1 for b in a)


x = [1, 2, ['a', 'b', 'c']]

a = len(x)
b = re_len(x)

print(a)  # 3
print(b)  # 5

コードの re_len はリストの要素を再帰的にカウントする関数です。実際 x の長さは 3 ですが、子リストの要素を要素として考えると

1, 2, 'a', 'b', 'c'

が要素になります。よって re_len(x) は 5 になります。リストそのものはカウントしないで、リストでない純粋な要素をトータルでカウントする関数が、上にあげた re_len という関数です。これは “Deep length” of a list を参考にしました。