Pythonでリスト(配列)の要素数を取得したいとき、どの関数を使えばよいか迷う方は多いです。「サイズ」「長さ」「要素数」といった用語の違いが曖昧なまま検索している方も少なくありません。
Pythonではリストの要素数を取得する方法として、組み込み関数のlen()が基本です。用途に応じてcount()やcollections.Counterを使い分ける場面もあるため、それぞれの違いを正しく理解しておく必要があります。
この記事では、Pythonのリストの要素数をlen関数で取得する基本的な方法から、ネストされたリストの要素数取得、特定要素のカウント、そして「サイズ」「長さ」「要素数」の違いまでをサンプルコード付きで解説していきます。
目次
- Pythonのリスト(配列)の要素数をlen関数で取得する方法
- 1次元リストの要素数を取得する
- 文字列や数値が混在するリストの要素数を取得する
- Pythonのネストされたリスト(配列)の要素数を取得する方法
- 2次元リストの行数を取得する
- 2次元リストの全要素数を取得する
- Pythonのリストで特定の要素数をカウントする方法
- countメソッドで特定の要素の出現回数を取得する
- collections.Counterで全要素の出現回数を集計する
- Pythonのリストのサイズ・長さ・要素数の違い
- len関数が返すリストの長さと要素数の関係
- sys.getsizeofで取得するメモリサイズとの違い
- Pythonのリストの要素数に関するよくある質問
- 配列(list)の数をlen以外で取得する方法はありますか?
- 辞書やタプルでもlen関数を使えますか?
- 空のリストでlen関数を使うとどうなりますか?
Pythonのリスト(配列)の要素数をlen関数で取得する方法
Pythonのリスト(配列)の要素数を取得するには、組み込み関数であるlen()を使用します。Pythonでは通常list型を使用し、日本語では慣習的に「配列」と呼ばれることがありますが、厳密にはlistと標準ライブラリのarray.arrayは異なるデータ型です。len()関数とは、シーケンス型やコレクション型に含まれる要素の個数を整数値で返す関数です。
基本的な書き方は、以下の通りです。
len(リストオブジェクト)
len()関数を使ったリストの要素数取得方法として、以下の2つを紹介します。
- 1次元リストの要素数を取得する
- 文字列や数値が混在するリストの要素数を取得する
いずれの場合もlen()関数の使い方は同じで、リストに格納されている要素の型に関係なく個数を返します。
それでは各項目について、詳しく解説していきます。
1次元リストの要素数を取得する
1次元リストとは、要素がネスト(入れ子)されていない平坦な構造のリストのことです。len()関数にリストを渡すと、リスト内の要素数を整数値として返します。
以下のコードは、文字列のリストの要素数を取得する例です。
fruits = ["apple", "banana", "cherry", "date", "elderberry"]
count = len(fruits)
print(count) # 5
上記のコードでは、5つの文字列を格納したリストfruitsの要素数をlen()で取得しています。実行結果として5が出力されます。
数値のみのリストでも同様に動作します。以下のコードでは、整数を格納したリストの要素数を取得しています。
numbers = [10, 20, 30, 40]
print(len(numbers)) # 4
このように、len()関数はリスト内の要素の型に依存せず、格納されている要素の個数をそのまま返す仕組みです。
文字列や数値が混在するリストの要素数を取得する
Pythonのリストは異なるデータ型の要素を混在させて格納できるため、文字列や整数、浮動小数点数が混ざったリストでもlen()関数で要素数を取得できます。len()は要素の型を判別せず、リスト内のトップレベル要素の個数のみを返します。
以下のコードは、複数のデータ型が混在するリストの要素数を取得する例です。
mixed = ["hello", 42, 3.14, True, None]
print(len(mixed)) # 5
上記のコードでは、文字列や整数、浮動小数点数、真偽値、Noneが混在するリストの要素数を取得しています。データ型が異なっていても、要素の個数として5が正しく返されます。
リスト内にリストが含まれる場合でも、len()はネストされた内部リストを1つの要素として数えます。以下のコードで動作を確認できます。
mixed_nested = [1, "two", [3, 4, 5]]
print(len(mixed_nested)) # 3
[3, 4, 5]というリストは内部に3つの要素を持ちますが、len()はトップレベルの要素数のみを返すため、結果は3です。ネストされたリスト内部の要素数も含めて取得したい場合は、別の方法が必要になります。
Pythonのネストされたリスト(配列)の要素数を取得する方法
ネストされたリストとは、リストの中にリストが格納された構造のことで、2次元リストや多次元リストとも呼ばれます。前述のlen関数をネストされたリストに使用すると、最も外側のリストの要素数のみが返されるため、全要素数を取得するには別の方法が必要です。
ネストされたリストの要素数を取得する方法として、以下の2つがあります。
- 2次元リストの行数を取得する
- 2次元リストの全要素数を取得する
それぞれの方法は用途が異なり、行数の取得にはlen関数をそのまま使い、全要素数の取得にはリスト内包表記とsum関数を組み合わせます。
それでは各項目について、詳しく解説していきます。
2次元リストの行数を取得する
2次元リストの行数とは、外側のリストに格納されている内側のリストの個数のことです。len関数を2次元リストに直接適用すると、外側のリストの要素数、つまり行数が返されます。
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
row_count = len(matrix)
print(row_count) # 3
上記のコードでは、3つの内側リストを持つ2次元リストに対してlen関数を適用しています。結果として外側のリストの要素数である3が返されます。
各行の要素数(列数)を取得したい場合は、内側のリストに対してlen関数を適用します。以下のコードでは、各行の列数を個別に取得しています。
matrix = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
for i, row in enumerate(matrix):
print(f"行{i}: {len(row)}個")
# 行0: 3個
# 行1: 2個
# 行2: 4個
上記のコードでは、enumerate関数を使って各行のインデックスと内側リストを取り出し、それぞれにlen関数を適用しています。行ごとに要素数が異なるリスト(不均一なリスト)でも、各行の列数を正確に取得できます。
2次元リストの全要素数を取得する
2次元リスト(2階層のリスト)に含まれる全ての要素の合計数を取得するには、sum関数とジェネレータ式を組み合わせます。ジェネレータ式とは、リスト内包表記と似た構文で、メモリを節約しながら値を1つずつ生成する仕組みのことです。
この方法は2階層のリストにのみ有効であり、3階層以上のネストには対応していません。
matrix = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
total = sum(len(row) for row in matrix)
print(total) # 9
上記のコードでは、各行のlen関数の戻り値をジェネレータ式で生成し、sum関数で合計しています。3行の要素数(3 + 2 + 4)を合算した結果、全要素数として9が返されます。
別の方法として、内側リストの全要素を1つのリストに展開(フラット化)してからlen関数を適用する方法もあります。以下のコードでは、リスト内包表記で2次元リストをフラット化しています。
matrix = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
flat = [elem for row in matrix for elem in row]
print(len(flat)) # 9
print(flat) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
上記のコードでは、二重のfor文を使って内側リストの全要素を1つのリストに展開し、そのリストの要素数をlen関数で取得しています。このフラット化の方法も2階層のリストにのみ有効です。
単に個数だけ知りたい場合はsum+ジェネレータ式の方が新しいリストを作らないためメモリ効率が良く、フラット化後のリストを他の処理でも使用する場合はリスト内包表記が適しています。
Pythonのリストで特定の要素数をカウントする方法
Pythonのリストでは、len関数で取得できるのはリスト全体の要素数です。特定の値がリスト内に何回出現するかを調べるには、countメソッドやcollections.Counterクラスを使用します。
特定の要素の出現回数をカウントする方法として、以下の2つがあります。
- countメソッドで特定の要素の出現回数を取得する
- collections.Counterで全要素の出現回数を集計する
countメソッドは1つの値を指定してその出現回数を返し、Counterクラスはリスト内の全要素の出現回数を一括で集計できます。用途に応じて使い分けることによって、効率的にカウント処理を実装できるでしょう。
それでは各方法について、詳しく解説していきます。
countメソッドで特定の要素の出現回数を取得する
countメソッドは、Pythonのリストに組み込まれたメソッドで、引数に指定した値がリスト内に何回出現するかを整数で返します。リスト.count(値)の形式で呼び出し、該当する値の個数を返します。
以下のコードでは、countメソッドを使って特定の要素の出現回数を取得しています。
fruits = ["apple", "banana", "apple", "orange", "apple", "banana"]
# "apple"の出現回数を取得する
apple_count = fruits.count("apple")
print(apple_count) # 3
# "banana"の出現回数を取得する
banana_count = fruits.count("banana")
print(banana_count) # 2
# リストに存在しない要素を指定した場合
grape_count = fruits.count("grape")
print(grape_count) # 0
上記のコードでは、fruits.count("apple")が3を返し、リスト内に存在しない"grape"を指定した場合は0を返しています。countメソッドはリストに存在しない値を指定してもエラーにならず、0を返す仕様です。
数値のリストでも同様にcountメソッドを使用できます。
numbers = [1, 2, 3, 2, 1, 2, 4, 1]
# 数値の出現回数を取得する
print(numbers.count(1)) # 3
print(numbers.count(2)) # 3
print(numbers.count(5)) # 0
数値リストの場合も文字列と同じく、指定した値の出現回数を整数で取得できます。ただし、countメソッドは呼び出すたびにリスト全体を走査するため、複数の要素を一括でカウントしたい場合は次のcollections.Counterが適しています。
collections.Counterで全要素の出現回数を集計する
collectionsとは、Python標準ライブラリに含まれる特殊なコンテナ型を提供するモジュールのことです。collections.Counterはこのモジュールに含まれるクラスで、ハッシュ可能な要素(文字列や数値など)を持つリストを渡すと、全要素の出現回数を辞書のサブクラスとして一括集計します。なお、リスト内にリストや辞書などハッシュ不可能な要素が含まれる場合はTypeErrorが発生します。
以下のコードでは、Counterクラスを使ってリスト内の全要素の出現回数を集計しています。
from collections import Counter
fruits = ["apple", "banana", "apple", "orange", "apple", "banana"]
# 全要素の出現回数を集計する
counter = Counter(fruits)
print(counter) # Counter({'apple': 3, 'banana': 2, 'orange': 1})
# 特定の要素の出現回数を取得する
print(counter["apple"]) # 3
print(counter["banana"]) # 2
print(counter["grape"]) # 0(存在しないキーでもエラーにならない)
上記のコードでは、from collections import CounterでCounterクラスをインポートし、リストを引数に渡しています。Counterオブジェクトは辞書のようにキーを指定して出現回数を取得でき、存在しないキーを指定した場合は0を返します。
Counterクラスにはmost_commonメソッドがあり、出現回数が多い順に要素を取得できます。
from collections import Counter
scores = [85, 90, 85, 70, 90, 85, 70, 90, 60, 85]
counter = Counter(scores)
# 出現回数が多い順に全要素を取得する
print(counter.most_common())
# [(85, 4), (90, 3), (70, 2), (60, 1)]
# 出現回数が多い上位2件を取得する
print(counter.most_common(2))
# [(85, 4), (90, 3)]
most_common()は引数を省略すると全要素を出現回数の降順で返し、引数に整数を指定すると上位N件のみを取得します。countメソッドが1つの値の出現回数を返すのに対し、Counterクラスは全要素の集計や出現頻度の順位付けが必要な場面に適しています。
Pythonのリストのサイズ・長さ・要素数の違い
Pythonのリストに関する情報を調べると、「サイズ」「長さ」「要素数」という3つの用語が登場します。len関数で取得する値に限れば、これら3つは同じ意味を指しており、リストに含まれる要素の個数を返します。
一方で、sys.getsizeof関数で取得する「サイズ」は、リストオブジェクト自体がメモリ上で占有するバイト数を意味し、要素数とは全く異なる値です。ここでは、それぞれの違いを2つの観点から解説していきます。
- len関数が返すリストの長さと要素数の関係
- sys.getsizeofで取得するメモリサイズとの違い
それぞれの関数が返す値の意味を正確に把握することによって、用語の混同を防げます。それでは各項目について、詳しく解説していきます。
len関数が返すリストの長さと要素数の関係
Pythonの公式ドキュメントでは、len関数について以下のように定義しています。この定義の通り、len関数が返す「length(長さ)」と「number of items(要素の数)」は同一の値です。
Return the length (the number of items) of an object. The argument may be a sequence (such as a string, bytes, tuple, list, or range) or a collection (such as a dictionary, set, or frozen set).
出典:Python公式ドキュメント - Built-in Functions - len()
日本語では「リストのサイズを取得したい」「リストの長さを知りたい」「リストの要素数を調べたい」と検索されますが、いずれもlen関数で解決できます。ただし、Python公式の用語ではlenは「length」と「number of items」を返すと定義されており、「size」という語は使われていません。Pythonではsys.getsizeofがメモリサイズ(バイト単位)を返す別の関数として存在するため、「サイズ」という語は文脈によって意味が異なる点に注意が必要です。以下のコードで、len関数が返す値を確認してみましょう。
fruits = ["apple", "banana", "cherry", "date", "elderberry"]
# len関数は「長さ」=「要素数」を返す
print(len(fruits)) # 5
日本語圏では「サイズ」「長さ」「要素数」が同じ意味で使われることが多いですが、前述の通りsys.getsizeofによるメモリサイズとは別概念です。
sys.getsizeofで取得するメモリサイズとの違い
sys.getsizeof関数は、Pythonオブジェクトがメモリ上で占有するバイト数を返す関数です。len関数が返す「要素の個数」とは意味が異なり、そのオブジェクトに直接帰属するメモリ消費量を示します。
Return the size of an object in bytes. The object can be any type of object. All built-in objects will return correct results, but this does not have to hold true for third-party extensions as it is implementation specific.
出典:Python公式ドキュメント - sys.getsizeof()
以下のサンプルコードで、len関数とsys.getsizeof関数の返す値を比較してみましょう。
import sys
numbers = [1, 2, 3, 4, 5]
# len関数: 要素の個数を返す
element_count = len(numbers)
print(f"要素数: {element_count}")
# sys.getsizeof: メモリサイズ(バイト単位)を返す
memory_size = sys.getsizeof(numbers)
print(f"メモリサイズ: {memory_size} bytes")
# 要素数を増やしてメモリサイズの変化を確認
numbers_large = list(range(100))
print(f"\n要素数100のリスト:")
print(f"要素数: {len(numbers_large)}")
print(f"メモリサイズ: {sys.getsizeof(numbers_large)} bytes")
実行環境(CPython/PyPy、32bit/64bit、Pythonバージョン)によって具体的なバイト数は異なりますが、要素数5のリストでもメモリサイズは数十〜百数十バイト程度の値を返します。要素数が5であるのに対し、メモリサイズはそれよりはるかに大きな数値を返すため、両者が全く異なる情報であることがわかります。
なお、sys.getsizeofはリストオブジェクト自体のサイズのみを返し、各要素が参照しているオブジェクトのサイズは含みません。リスト全体の総メモリ使用量を正確に把握したい場合は、各要素のサイズも個別に計測する必要があります。
Pythonのリストの要素数に関するよくある質問
配列(list)の数をlen以外で取得する方法はありますか?
len()関数以外にも、for文とカウンタ変数を組み合わせてリストの要素数を取得する方法があります。以下のコードでは、ループで1要素ずつカウントしています。
my_list = [10, 20, 30, 40, 50]
count = 0
for _ in my_list:
count += 1
print(count) # 5
上記の方法でも要素数は取得できますが、len()関数のほうがコードが短く処理速度も速いため、通常はlen()の使用を推奨します。
辞書やタプルでもlen関数を使えますか?
len()関数はリストだけではなく、辞書やタプル、文字列、セットなど多くのデータ型に対応しています。以下のコードで各データ型の要素数を取得できます。
print(len((1, 2, 3))) # タプル: 3
print(len({"a": 1, "b": 2})) # 辞書: 2
print(len("hello")) # 文字列: 5
print(len({1, 2, 3, 4})) # セット: 4
辞書の場合はキーの数が返され、文字列の場合は文字数が返されます。
空のリストでlen関数を使うとどうなりますか?
空のリストにlen()関数を使うと、エラーは発生せず0が返されます。ただし、Noneを渡すとTypeErrorが発生するため注意が必要です。
print(len([])) # 0
# print(len(None)) # TypeError: object of type 'NoneType' has no len()
変数が空かどうかを判定するだけなら、Pythonではif my_list:と書くのが一般的です。この書き方は空リストとNoneの両方をFalsyとして判定します。空リストとNoneを明確に区別する必要がある場合は、if my_list is not None:でNoneでないことを確認した上でlen()を使用してください。
※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。
ITやプログラミングに関するコラム
PythonをWebで実行する方法
共通テスト「情報Ⅰ」2年目で変わる、日本の教育と学び方
gitでブランチ(branch)を切り替える方法
git cloneでブランチを指定する方法
64GBのメモリが必要な人・不要な人の特徴
PCを再起動するコマンド一覧
CapsLock以外で大文字になる原因【Windows編】
パソコンで大文字になるのを解除する方法
面白いAIの活用事例を業界別に紹介
Gitでcommit(コミット)を取り消す方法
ITやプログラミングに関するニュース
サイボウズがkintone AIを正式提供、β版から約1年を経てクレジット制を導入
ロゼッタのラクヤクAIがCSRドラフト作成期間を90%以上短縮、従来4週間を約2日に
AI CROSSが不動産業界向け生成AI伴走支援を開始、アスコットの業務AI実装を実践サポート
日本情報クリエイトが「オーナー提案AIロボⅡ」売買査定を刷新、月1万円からW査定が回数無制限に
Wur株式会社がAI新規事業診断サービス「MVP事業診断レポート」をリリース、12の質問で事業構想を約10分で分析
バトンズがM&A専門家向け「AI概要書」β版を提供開始、企業概要書のドラフトを最速3分で自動生成
SCSKが観光DXサービス「Connexia」を開発、首里城公園でNFT活用の周遊促進が始動
Verdent AI発表、エンジニア不要でソフトウェアを構築する「AIエンジニアリングチーム」が登場
ゼネラルBREXAテクノロジーが外食・小売向けAIサービス「aimana」を開発、店長の意思決定をデータで支援
田中組がKencopa工程AIエージェント製品版を先行利用開始、建設現場の工程管理属人化を解消へ
