Categories
list python

How do I get the number of elements in a list in Python?

2191

How do I get the number of elements in the list items?

items = ["apple", "orange", "banana"]

# There are 3 items.

1

2881

The len() function can be used with several different types in Python – both built-in types and library types. For example:

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

0

    286

    How to get the size of a list?

    To find the size of a list, use the builtin function, len:

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

    And now:

    len(items)
    

    returns 3.

    Explanation

    Everything in Python is an object, including lists. All objects have a header of some sort in the C implementation.

    Lists and other similar builtin objects with a “size” in Python, in particular, have an attribute called ob_size, where the number of elements in the object is cached. So checking the number of objects in a list is very fast.

    But if you’re checking if list size is zero or not, don’t use len – instead, put the list in a boolean context – it treated as False if empty, True otherwise.

    From the docs

    len(s)

    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).

    len is implemented with __len__, from the data model docs:

    object.__len__(self)

    Called to implement the built-in function len(). Should return the length of the object, an integer >= 0. Also, an object that doesn’t
    define a __nonzero__() [in Python 2 or __bool__() in Python 3] method and whose __len__() method returns zero
    is considered to be false in a Boolean context.

    And we can also see that __len__ is a method of lists:

    items.__len__()
    

    returns 3.

    Builtin types you can get the len (length) of

    And in fact we see we can get this information for all of the described types:

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

    Do not use len to test for an empty or nonempty list

    To test for a specific length, of course, simply test for equality:

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

    But there’s a special case for testing for a zero length list or the inverse. In that case, do not test for equality.

    Also, do not do:

    if len(items): 
        ...
    

    Instead, simply do:

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

    or

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

    I explain why here but in short, if items or if not items is both more readable and more performant.

    0

      77

      While this may not be useful due to the fact that it’d make a lot more sense as being “out of the box” functionality, a fairly simple hack would be to build a class with a length property:

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

      You can use it like so:

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

      Essentially, it’s exactly identical to a list object, with the added benefit of having an OOP-friendly length property.

      As always, your mileage may vary.

      1

      • 25

        just so you know, you can just do length = property(len) and skip the one line wrapper function and keep the documentation / introspection of len with your property.

        Jun 13, 2016 at 2:17