Lists are one of the fundamental data structures in Python used to store ordered collections of elements. Unlike strings which contain ordered sequences of characters, lists can hold elements of any data type including integers, floats, strings, and even other lists. Lists are very versatile and have many uses in Python programming.
In this comprehensive guide, we will cover the basics of Python lists including creation, indexing and slicing, common properties and operations, built-in functions, and mutability. We will also go over real-world applications and examples of using lists in Python. Let’s get started!
Table of Contents
Open Table of Contents
Creating Lists in Python
Python lists can be created by enclosing elements inside square brackets []
. Elements are separated by commas. For example:
primes = [2, 3, 5, 7]
fruits = ['apple', 'banana', 'mango']
mixed = [10, 'hello', 3.4]
Lists in Python can hold elements of any data type, be it integers, strings, floats, or a combination of different types. And they need not be homogeneous always.
Initializing an Empty List
We can initialize an empty list in Python simply with empty brackets.
empty_list = []
Using the list() Constructor
The list() constructor can also be used to initialize an empty list or convert another sequence like string, tuple, etc. into a list.
# Empty list
empty_list = list()
# From a string
chars = list('Hello') # ['H', 'e', 'l', 'l', 'o']
# From a tuple
tuple_ = (1, 2, 3)
list_from_tuple = list(tuple_) # [1, 2, 3]
Indexing and Slicing Lists in Python
Lists in Python are indexed and sliced the same way as strings. The index starts from 0 for the first element and goes on to len(list) - 1 for the last element. We can access individual elements using square bracket notation list[index]
.
fruits = ['apple', 'banana', 'mango']
print(fruits[0]) # 'apple'
print(fruits[1]) # 'banana'
print(fruits[2]) # 'mango'
Trying to access an index outside the bounds will result in an IndexError
.
Slicing lists returns a new list containing the sliced elements. The slice has the syntax [start:stop:step]
.
fruits = ['apple', 'banana', 'mango', 'orange']
fruits[1:3] # ['banana', 'mango'] - elements 1 upto 3-1=2
fruits[0:4:2] # ['apple', 'mango'] - every alternate element
If start index isn’t defined, slicing starts from the first element. If stop index isn’t defined, slice goes till the end of the list. The step index defaults to 1 if not provided.
fruits[:3] # ['apple', 'banana', 'mango']
fruits[1:] # ['banana', 'mango', 'orange']
fruits[::1] # ['apple', 'banana', 'mango', 'orange'] - default step of 1
Negative indices can be used for slicing lists as well, which starts counting from the end of the list.
fruits = ['apple', 'banana', 'mango', 'orange']
fruits[-3:-1] # ['banana', 'mango']
fruits[-3:] # ['banana', 'mango', 'orange']
Common List Properties and Operations
Now that we have seen how to create and index lists in Python, let us go through some common properties and operations related to lists.
Finding Length of List
We can find the length of a list by using the len()
function:
fruits = ['apple', 'banana', 'mango']
length = len(fruits)
print(length) # 3
Checking if Element Exists in List
We can check if a particular element exists in the list or not using the in
keyword:
fruits = ['apple', 'banana', 'mango']
print('apple' in fruits) # True
print('strawberry' in fruits) # False
Concatenating and Multiplying Lists
Lists in Python can be concatenated using the +
operator:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list3 = list1 + list2 # [1, 2, 3, 4, 5, 6]
They can also be multiplied by an integer value using the *
operator:
fruits = ['apple', 'banana', 'mango']
fruits_twice = fruits * 2
# ['apple', 'banana', 'mango', 'apple', 'banana', 'mango']
This repeats the elements in the list as many times as the multiplier.
Counting Occurrences of Element
We can count how many times an element occurs in the list using the count()
method:
numbers = [1, 2, 3, 2, 1, 5]
print(numbers.count(1)) # 2
print(numbers.count(3)) # 1
print(numbers.count(4)) # 0 - element doesn't exist
Reversing a List
To reverse the elements of a list in-place we can use the reverse()
method:
numbers = [1, 2, 3, 4, 5]
numbers.reverse()
print(numbers) # [5, 4, 3, 2, 1]
Finding Index of Element
We can find the index of the first occurrence of an element using the index()
method:
fruits = ['apple', 'banana', 'mango', 'apple']
print(fruits.index('apple')) # 0
print(fruits.index('mango')) # 2
If the element doesn’t exist in the list, this raises a ValueError
.
These are some of the basic yet widely used list operations and properties in Python. Let’s now look at some more operations by using built-in methods for lists.
Built-in List Methods in Python
Python provides a variety of built-in methods to carry out common useful operations on lists with ease. We will take a look at some of them here.
Adding Elements
append()
- Adds element to end of listinsert()
- Inserts element at given indexextend()
- Appends elements of another iterable to list
fruits = ['apple', 'banana']
fruits.append('orange')
print(fruits) # ['apple', 'banana', 'orange']
fruits.insert(1, 'cherry')
print(fruits) # ['apple', 'cherry', 'banana', 'orange']
fruits.extend(['grape', 'mango'])
print(fruits) # ['apple', 'cherry', 'banana', 'orange', 'grape', 'mango']
Removing Elements
remove()
- Remove first occurrence of elementpop()
- Remove element at given index (default last)clear()
- Remove all elements from list
fruits = ['apple', 'banana', 'cherry', 'banana']
fruits.remove('banana')
print(fruits) # ['apple', 'cherry', 'banana']
fruits.pop(1)
print(fruits) # ['apple', 'banana']
fruits.clear()
print(fruits) # [] - empty list
Sorting a List
sort()
- Sorts the list in-placesorted()
- Returns a sorted list leaving original unaffected
numbers = [3, 2, 5, 1]
numbers.sort()
print(numbers) # [1, 2, 3, 5]
numbers = [3, 2, 5, 1]
sorted_nums = sorted(numbers)
print(numbers) # [3, 2, 5, 1] - unchanged
print(sorted_nums) # [1, 2, 3, 5]
By default sorting is done in ascending order. We can pass reverse=True
to sort in descending order.
numbers.sort(reverse=True) # [5, 3, 2, 1]
sorted_nums = sorted(numbers, reverse=True) # [5, 3, 2, 1]
More Methods
Some other useful built-in methods include:
copy()
- Returns shallow copy of listindex()
- Returns first index of elementcount()
- Counts occurrences of elementclear()
- Removes all elements from list
fruits = ['apple', 'banana', 'cherry', 'apple']
fruit_copy = fruits.copy()
print(fruits.index('cherry')) # 2
print(fruits.count('apple')) # 2
fruits.clear()
print(fruits) # []
This covers some of the commonly used built-in methods for lists in Python.
Lists are Mutable in Python
One key difference between lists and strings is that lists are mutable in Python. Mutability refers to the ability to modify the value of an object after it has been created.
Lists are mutable - we can modify lists after creation by:
- Adding new elements using
append()
,insert()
, etc. - Removing elements using
remove()
,pop()
, etc. - Modifying existing elements by accessing them via index
For example:
fruits = ['apple', 'mango', 'banana']
# Appending a new element
fruits.append('orange')
# Removing an element
fruits.remove('mango')
# Modifying an element
fruits[0] = 'cherry'
print(fruits) # ['cherry', 'banana', 'orange']
Whereas strings are immutable in Python - their individual characters cannot be changed once created.
This mutability of lists becomes a powerful feature that allows modifying them after creation. It sets them apart from other ordered sequence data structures like strings and tuples in Python.
Real World Examples - List Usage
Now that we have seen the basics of lists in Python, let’s look at some real world examples that illustrate common uses of lists:
1. Grocery List
Let’s create a grocery list by adding all the items we need to buy from the market:
grocery_items = [] # empty to start
# Adding items
grocery_items.append('Milk')
grocery_items.append('Eggs')
grocery_items.append('Butter')
grocery_items.append('Apples')
grocery_items.append('Sugar')
print(grocery_items)
# ['Milk', 'Eggs', 'Butter', 'Apples', 'Sugar']
# Removing bought items
grocery_items.remove('Eggs')
grocery_items.remove('Butter')
print(grocery_items)
# ['Milk', 'Apples', 'Sugar']
Here we started with an empty list and kept adding items we needed to buy. Later we removed items already purchased. This demonstrates real-world mutability and dynamics of Python lists.
2. Student Database
Lists can be used to represent multiple records in a simple database. For example, we can create a students
list containing elements as dictionaries holding details like roll number, name, marks, etc.
# Student details database
students = [
{'roll': 101, 'name': 'Jack', 'marks': 80},
{'roll': 102, 'name': 'Mary', 'marks': 90},
{'roll': 103, 'name': 'John', 'marks': 85}
]
# Accessing student details
print(students[0])
# {'roll': 101, 'name': 'Jack', 'marks': 80}
print(students[1]['name'])
# Mary
# Modifying details
students[2]['marks'] = 75
print(students[2]['marks'])
# 75
This demonstrates how lists are useful for grouping related data sets and modifying them.
3. To-Do List
A simple to-do list can be implemented using a Python list:
todos = ['Finish project', 'Call mom', 'Buy groceries']
# Check off first item
todos.pop(0)
# Add new item
todos.append('Sign up for course')
print(todos)
# ['Call mom', 'Buy groceries', 'Sign up for course']
Here we are adding tasks to a to-do list and removing them when done. This shows a real-world mutable list in action.
4. Stack Implementation
Lists can be used to implement stacks which follow LIFO (Last In First Out) order. We can push to and pop from the end of list to simulate a stack:
stack = []
# Pushing items onto stack
stack.append(1)
stack.append(2)
stack.append(3)
# Popping item off stack
x = stack.pop()
print(stack) # [1, 2]
print(x) # 3
The last item pushed is removed first following LIFO order. This demonstrates lists mimicking the stack data structure.
There are many more such applications of Python lists like implementing queues, histograms, etc. where their dynamic nature and ease of use makes them quite handy.
Conclusion
To summarize, here are some key points about Python lists:
- Lists are ordered collections of elements that can contain mixed data types
- Elements can be accessed or sliced using indices like arrays
- Lists are mutable and dynamic - they support addition, removal, and modification of elements
- Built-in methods provide easy list operations like sorting, reversing, etc.
- Lists have many real-world use cases like databases, stacks, queues, etc.
With this comprehensive guide, you should have a good understanding of the basics of lists in Python. They are a versatile built-in data type that is an essential part of Python programming. Lists provide an efficient way to work with ordered collections of data.