Как получить количество элементов в списке в Python?

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

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

Как получить количество элементов в списке?

6 ответов


на len()


как получить размер списка?

чтобы найти размер списка, используйте встроенную функцию,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 но это может привести к проблемам с пользовательскими классами, потому что lenlength_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[:] неявно, поэтому также необязательно)