.. _sec-lists:
Lists
-----
A *list* is an ordered collection of items, and is indicated in `Python `_ via square brackets (``[]``),
all individual elements being separated by commas. There need not be any
particular relation between the elements, and each element can be of a different
data type as well. Some examples are given below: ::
>>> a = ['hello',2,float(5),9,7,'wow',8]
>>> a
['hello', 2, 5.0, 9, 7, 'wow', 8]
The elements within a list are indexed starting from ``0`` and can be accessed using the
square bracket (``[]``) operator, as shown below. `Python `_ also allows us to compute the index
of an entry by passing the value to the ``index`` operator. Unlike arrays in `Java `_
or `C++ `_, negative indices *are*
valid and point to elements from the end of the list, i.e., an index of ``-1`` points to the *last* element, an index of ``-2`` points to the second last element, and so on.
A list can also be *sliced through* using the operator ``[start:end]``, which includes all
elements with indices between ``start`` and ``end-1``. If ``start`` is not
specified, it defaults to ``0``, and if ``end`` is not specified, it defaults to
the end of the list. For example: ::
>>> print a[1]
2
>>> print a[-1]
8
>>> print a.index(9)
3
>>> a[1:4]
[2, 5.0, 9]
>>> a[1:-1]
[2, 5.0, 9, 7, 'wow']
>>> a[:5]
['hello', 2, 5.0, 9, 7]
>>> a[2:]
[5.0, 9, 7, 'wow', 8]
>>> a[:]
['hello', 2, 5.0, 9, 7, 'wow', 8]
Individual elements can be modified in a straightforward manner by using the
assignment operator (``=``). Elements can be added to the end of the list using
the ``append`` operator, and anywhere within the list using the ``insert``
operator. Likewise, elements can be deleted from the end of the list by using the ``pop`` operator, or
anywhere within the list by using the ``del`` keyword.
Multiple elements can be added at the same time from the end of the
list using the ``extend`` operator. ::
>>> a = ['hello',2,float(5)]
>>> a[0] = 4
>>> a
[4, 2, 5.0]
>>> a.append('wow')
>>> a
[4, 2, 5.0, 'wow']
>>> a.pop()
'wow'
>>> a
[4, 2, 5.0]
>>> a.insert(2,'hello')
>>> a
[4, 2, 'hello', 5.0]
>>> del a[1]
>>> a
[4, 'hello', 5.0]
>>> a.extend([9,7,'wow'])
>>> a
[4, 'hello', 5.0, 9, 7, 'wow']
.. warning::
Note that if the ``append`` operator is used in place of the ``extend``
operator above, then it will append a *new* list to the original list. This
is a common error that should be avoided at all costs. The flexibility of
a list to simultaneously contain elements of different data types can also
be a hazard at times, as no error will be reported back. For example: ::
>>> a = [4, 'hello', 5.0]
>>> a.append([9,7,'wow'])
>>> a
[4, 'hello', 5.0, [9, 7, 'wow']]
Unlike the ``append`` operator, the ``pop`` operator returns back the element deleted from the list. If an index is supplied to the ``pop``
operator, then it can also be used for deleting an element from anywhere inside the list. Elements can also be deleted *by value* using the ``remove``
operator. For example: ::
>>> mystring = "Old McDonald had a farm, Duda!"
>>> words = mystring.split()
>>> words
['Old', 'McDonald', 'had', 'a', 'farm,', 'Duda!']
>>> words.pop(0)
'Old'
>>> words
['McDonald', 'had', 'a', 'farm,', 'Duda!']
>>> words.remove('Duda!')
>>> words
['McDonald', 'had', 'a', 'farm,']
Note how we used the ``split`` operator to generate a list of all the words in a string. A list can also be sorted using the ``sort`` operator. Elements
can be arranged in either ascending or descending order, depending on whether the ``reverse`` argument is set. A list can also be easily reversed using
the ``reverse`` operator. ::
>>> a = [5,2,7,4,9]
>>> a.sort()
>>> a
[2, 4, 5, 7, 9]
>>> a.sort(reverse=True)
>>> a
[9, 7, 5, 4, 2]
>>> mystring = "Old McDonald had a farm, Duda!"
>>> words = mystring.split()
>>> words.sort()
>>> words
['Duda!', 'McDonald', 'Old', 'a', 'farm,', 'had']
>>> words = mystring.split()
>>> words.reverse()
>>> words
['Duda!', 'farm,', 'a', 'had', 'McDonald', 'Old']
Similar to `Java `_ or `C++ `_,
`Python `_ assigns an `ASCII `_ code to all `alphanumeric `_ characters,
where all capitalized letters have a lower ASCII code compared to their non-capitalized counterparts. This is why, for example, ``'Old'`` appears before ``'a'``
in the sorted list above.
The ``sort`` operator sorts all the elements of a list *in-place*,
so the order of the elements does change. One can also use the ``sorted``
operator that acts on a list and returns another list which is the sorted
version of the original list. Elements can also be sorted in reverse if the
``reverse`` argument is set. ::
>>> a = [5,2,7,4,9]
>>> b = sorted(a)
>>> b
[2, 4, 5, 7, 9]
>>> b = sorted(a,reverse=True)
>>> b
[9, 7, 5, 4, 2]
>>> a
[5, 2, 7, 4, 9]
The length of a list can be obtained by using the ``len`` keyword. The addition
operator (``+``) is overloaded for lists to mean concatenation. Note that
multiplying a list by a constant does not scale the individual elements by the
given constant, instead, it concatenates the original list to itself that many
times. The operators ``+=`` and ``*=`` are likewise defined. For example: ::
>>> a = [5,2,7,4,9]
>>> len(a)
5
>>> b = [2,11,7]
>>> a+b
[5, 2, 7, 4, 9, 2, 11, 7]
>>> b*3
[2, 11, 7, 2, 11, 7, 2, 11, 7]
>>> a+=b
>>> a
[5, 2, 7, 4, 9, 2, 11, 7]
>>> b*=2
>>> b
[2, 11, 7, 2, 11, 7]