web-dev-qa-db-ja.com

Pythonでリストの要素数を取得するにはどうすればいいですか?

次の点を考慮してください。

items = []
items.append("Apple")
items.append("orange")
items.append("banana")

# FAKE METHOD:
items.amount()  # Should return 3

リストitemsの要素数を知るにはどうすればいいですか?

1771
y2k

len()関数はPythonのいくつかの異なる型 - 組み込み型とライブラリ型の両方で使用できます。例えば:

>>> len([1,2,3])
3

公式の2.xドキュメントはこちらです: len()
公式の3.xドキュメントはこちら: len()

2470
gnud

リストのサイズを取得する方法

リストのサイズを調べるには、組み込み関数lenを使います。

items = []
items.append("Apple")
items.append("orange")
items.append("banana")

そしていま:

len(items)

3を返します。

説明

Pythonのすべてはリストを含むオブジェクトです。 Cの実装では、すべてのオブジェクトに何らかのヘッダーがあります。

特にPythonで "サイズ"を持つリストやその他の同様の組み込みオブジェクトは、オブジェクト内の要素数がキャッシュされるob_sizeという属性を持ちます。そのため、リスト内のオブジェクト数を確認するのは非常に高速です。

しかし、リストのサイズがゼロかどうかをチェックするのであれば、lenを使わないでください。 - リストをブール値のコンテキストに入れてください - 空ならばFalse、そうでなければTrueとして扱われます

docs から

len(s)

オブジェクトの長さ(項目数)を返します。引数はシーケンス(文字列、バイト、タプル、リスト、範囲など)またはコレクション(辞書、セット、フリーズセットなど)です。

lenは、データモデル docs__len__で実装されています。

object.__len__(self)

組み込み関数len()を実装するために呼び出されます。オブジェクトの長さ、0以上の整数を返します。また、[Python 2では__nonzero__()]、Python 3では[__bool__()]メソッドを定義せず、__len__()メソッドがゼロを返すオブジェクトはブール値ではfalseと見なされます。コンテキスト。

そして__len__がリストのメソッドであることもわかります。

items.__len__()

3を返します。

組み込み型はあなたが得ることができるlen(長さ)

そして実際には、記述されているすべてのタイプについてこの情報を取得できることがわかります。

>>> all(hasattr(cls, '__len__') for cls in (str, bytes, Tuple, list, 
                                            xrange, dict, set, frozenset))
True

空のリストまたは空でないリストをテストするためにlenを使用しないでください

特定の長さをテストするには、もちろん、等価性をテストするだけです。

if len(items) == required_length:
    ...

しかし、長さゼロのリストまたはその逆をテストするための特別な場合があります。その場合、平等をテストしないでください。

また、しないでください。

if len(items): 
    ...

代わりに、単にしてください:

if items:     # Then we have some items, not empty!
    ...

または

if not items: # Then we have an empty list!
    ...

I ここでその理由を説明してください しかし、要するにif itemsまたはif not itemsはより読みやすく、より高性能です。

201
Aaron Hall

これは「すぐに使える」機能としてより理にかなっているという事実のために有用ではないかもしれませんが、かなり簡単なハックはlengthプロパティでクラスを構築することでしょう:

class slist(list):
    @property
    def length(self):
        return len(self)

あなたはそのようにそれを使うことができます:

>>> l = slist(range(10))
>>> l.length
10
>>> print l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

基本的に、それはOOPにやさしいlengthプロパティを持つという追加の利点を持つ、リストオブジェクトとまったく同じです。

いつものように、あなたの走行距離は変わるかもしれません。

71
Naftuli Kay

len 以外に operator.length_hint を使うこともできます(Python 3.4以降が必要です)。通常のlistでは両方とも同等ですが、length_hintはリストイテレータの長さを取得することを可能にします。これは特定の状況で役に立ちます。

>>> from operator import length_hint
>>> l = ["Apple", "orange", "banana"]
>>> len(l)
3
>>> length_hint(l)
3

>>> list_iterator = iter(l)
>>> len(list_iterator)
TypeError: object of type 'list_iterator' has no len()
>>> length_hint(list_iterator)
3

しかしlength_hintは定義上「ヒント」にすぎないので、ほとんどの場合lenが優れています。

__len__へのアクセスを示唆するいくつかの答えを見ました。これはlistのような組み込みクラスを扱う場合は大丈夫ですが、len(とlength_hint)が安全性チェックを実装しているため、カスタムクラスで問題が生じる可能性があります。たとえば、両方とも負の長さや特定の値(sys.maxsize値)を超える長さを許可しません。したがって、__len__メソッドの代わりにlen関数を使用する方が常に安全です。

15
MSeifert

先に挙げた例としてあなたの質問に答える:

items = []
items.append("Apple")
items.append("orange")
items.append("banana")

print items.__len__()
7
Shai Alon

そして完全を期すために、len()関数を使わなくても可能です(私はこれを良いオプションとは考えないでください。

def count(list):
  item_count = 0
  for item in list[:]:
    item_count += 1
  return item_count

count([1,2,3,4,5])

list[:]のコロンは暗黙的であり、したがってオプションでもあります。)

新しいプログラマーのためのここでの教訓は、次のとおりです。ある時点で数えなくても、リスト内の項目数を取得することはできません。計算上、アイテムを追加するときにアイテムの数を追跡することをお勧めします。 Naftuli Kayの答えを見てください。

6
Jonathan Komar