次の点を考慮してください。
items = []
items.append("Apple")
items.append("orange")
items.append("banana")
# FAKE METHOD:
items.amount() # Should return 3
リストitems
の要素数を知るにはどうすればいいですか?
リストのサイズを取得する方法
リストのサイズを調べるには、組み込み関数len
を使います。
items = []
items.append("Apple")
items.append("orange")
items.append("banana")
そしていま:
len(items)
3を返します。
Pythonのすべてはリストを含むオブジェクトです。 Cの実装では、すべてのオブジェクトに何らかのヘッダーがあります。
特にPythonで "サイズ"を持つリストやその他の同様の組み込みオブジェクトは、オブジェクト内の要素数がキャッシュされるob_size
という属性を持ちます。そのため、リスト内のオブジェクト数を確認するのは非常に高速です。
しかし、リストのサイズがゼロかどうかをチェックするのであれば、len
を使わないでください。 - リストをブール値のコンテキストに入れてください - 空ならばFalse、そうでなければTrueとして扱われます 。
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
はより読みやすく、より高性能です。
これは「すぐに使える」機能としてより理にかなっているという事実のために有用ではないかもしれませんが、かなり簡単なハックは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
プロパティを持つという追加の利点を持つ、リストオブジェクトとまったく同じです。
いつものように、あなたの走行距離は変わるかもしれません。
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
関数を使用する方が常に安全です。
先に挙げた例としてあなたの質問に答える:
items = []
items.append("Apple")
items.append("orange")
items.append("banana")
print items.__len__()
そして完全を期すために、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の答えを見てください。