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 を参考にしました。