Как получить количество элементов в списке в Python?
items = []
items.append("apple")
items.append("orange")
items.append("banana")
# FAKE METHOD::
items.amount() # Should return 3
Как получить количество элементов в списке?
6 ответов
как получить размер списка?
чтобы найти размер списка, используйте встроенную функцию,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
осуществляется с __len__
, из модели данных docs:
object.__len__(self)
вызывается для реализации встроенной функции
len()
. Должна возвращать длину объекта, целое число >= 0. Кроме того, объект, который не определить__nonzero__()
[в Python 2 или__bool__()
в Python 3] Метод и чей__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!
...
я объяснить, почему здесь короче говоря,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]
по сути, он точно идентичен объекту списка, с дополнительным преимуществом наличия ООП-дружественного 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
значение). Поэтому всегда безопаснее использовать
отвечая на ваш вопрос в качестве примеров, также приведенных ранее:
items = []
items.append("apple")
items.append("orange")
items.append("banana")
print items.__len__()
и для полноты (принимая один для команды с downvotes), это возможно без использования len()
функция (я бы не одобрил это как хороший вариант):
def count(list):
item_count = 0
for item in list[:]:
item_count = item_count + 1
return item_count
count([1,2,3,4,5])
(двоеточие в list[:]
неявно, поэтому также необязательно)