Для работы с наборами данных Python предоставляет такие встроенные типы как списки, кортежи и словари.
Список (list) представляет тип данных, который хранит набор или последовательность элементов. Для создания списка в квадратных скобках ([]) через запятую перечисляются все его элементы. Во многих языках программирования есть аналогичная структура данных, которая называется массив. Например, определим список чисел:
numbers = [1, 2, 3, 4, 5]
Также для создания списка можно использовать конструктор list():
numbers1 = [] numbers2 = list()
Оба этих определения списка аналогичны — они создают пустой список.
Конструктор list для создания списока может принимать другой список:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9] numbers2 = list(numbers)
Для обращения к элементам списка надо использовать индексы, которые представляют номер элемента в списка. Индексы начинаются с нуля. То есть второй элемент будет иметь индекс 1. Для обращения к элементам с конца можно использовать отрицательные индексы, начиная с -1. То есть у последнего элемента будет индекс -1, у предпоследнего — -2 и так далее.
numbers = [1, 2, 3, 4, 5] print(numbers[0]) # 1 print(numbers[2]) # 3 print(numbers[-3]) # 3 numbers[0] = 125 # изменяем первый элемент списка print(numbers[0]) # 125
Если необходимо создать список, в котором повторяется одно и то же значение несколько раз, то можно использовать символ звездочки *. Например, определим список из шести пятерок:
numbers = [5] * 6 # [5, 5, 5, 5, 5, 5] print(numbers)
Кроме того, если нам необходим последовательный список чисел, то для его создания удобно использовать функцию range, которая имеет три формы:
range(end)
: создается набор чисел от 0 до числа endrange(start, end)
: создается набор чисел от числа start до числа endrange(start, end, step)
: создается набор чисел от числа start до числа end с шагом step
numbers = list(range(10)) print(numbers) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] numbers = list(range(2, 10)) print(numbers) # [2, 3, 4, 5, 6, 7, 8, 9] numbers = list(range(10, 2, -2)) print(numbers) # [10, 8, 6, 4]
Например, следующие два определения списка будут аналогичны, но за счет функции range мы сокращаем объем кода:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9] numbers2 = list(range(1, 10))
Список необязательно должен содержать только однотипные объекты. Мы можем поместить в один и тот же список одновременно строки, числа, объекты других типов данных:
objects = [1, 2.6, "Hello", True]
Перебор элементов
Для перебора элементов можно использовать как цикл for, так и цикл while.
Перебор с помощью цикла for:
companies = ["Microsoft", "Google", "Oracle", "Apple"] for item in companies: print(item)
Здесь вместо функции range мы сразу можем подставить имеющийся список companies.
Перебор с помощью цикла while:
companies = ["Microsoft", "Google", "Oracle", "Apple"] i = 0 while i < len(companies): print(companies[i]) i += 1
Для перебора с помощью функции len() получаем длину списка. С помощью счетчика i выводит по элементу, пока значение счетчика не станет равно длине списка.
Сравнение списков
Два списка считаются равными, если они содержат один и тот же набор элементов:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9] numbers2 = list(range(1,10)) if numbers == numbers2: print("numbers equal to numbers2") else: print("numbers is not equal to numbers2")
В данном случае оба списка будут равны.
Методы и функции по работе со списками
Для управления элементами списки имеют целый ряд методов. Некоторые из них:
- append(item): добавляет элемент item в конец списка
- insert(index, item): добавляет элемент item в список по индексу index
- remove(item): удаляет элемент item. Удаляется только первое вхождение элемента. Если элемент не найден, генерирует исключение ValueError
- clear(): удаление всех элементов из списка
- index(item): возвращает индекс элемента item. Если элемент не найден, генерирует исключение ValueError
- pop([index]): удаляет и возвращает элемент по индексу index. Если индекс не передан, то просто удаляет последний элемент.
- count(item): возвращает количество вхождений элемента item в список
- sort([key]): сортирует элементы. По умолчанию сортирует по возрастанию. Но с помощью параметра key мы можем передать функцию сортировки.
- reverse(): расставляет все элементы в списке в обратном порядке
Кроме того, Python предоставляет ряд встроенных функций для работы со списками:
- len(list): возвращает длину списка
- sorted(list, [key]): возвращает отсортированный список
- min(list): возвращает наименьший элемент списка
- max(list): возвращает наибольший элемент списка
Добавление и удаление элементов
Для добавления элемента применяются методы append()
и insert
, а для удаления — методы remove()
, pop()
и clear()
.
Использование методов:
users = ["Tom", "Bob"] # добавляем в конец списка users.append("Alice") # ["Tom", "Bob", "Alice"] # добавляем на вторую позицию users.insert(1, "Bill") # ["Tom", "Bill", "Bob", "Alice"] # получаем индекс элемента i = users.index("Tom") # удаляем по этому индексу removed_item = users.pop(i) # ["Bill", "Bob", "Alice"] last_user = users[-1] # удаляем последний элемент users.remove(last_user) # ["Bill", "Bob"] print(users) # удаляем все элементы users.clear()
Проверка наличия элемента
Если определенный элемент не найден, то методы remove и index генерируют исключение. Чтобы избежать подобной ситуации, перед операцией с элементом можно проверять его наличие с помощью ключевого слова in:
companies = ["Microsoft", "Google", "Oracle", "Apple"] item = "Oracle" # элемент для удаления if item in companies: companies.remove(item) print(companies)
Выражение item in companies
возвращает True, если элемент item имеется в списке companies. Поэтому конструкция if item in companies
может выполнить последующий блок инструкций в зависимости от наличия элемента в списке.
Подсчет вхождений
Если необходимо узнать, сколько раз в списке присутствует тот или иной элемент, то можно применить метод count()
:
users = ["Tom", "Bob", "Alice", "Tom", "Bill", "Tom"] users_count = users.count("Tom") print(users_count) # 3
Сортировка
Для сортировки по возрастанию применяется метод sort():
users = ["Tom", "Bob", "Alice", "Sam", "Bill"] users.sort() print(users) # ["Alice", "Bill", "Bob", "Sam", "Tom"]
Если необходимо отсортировать данные в обратном порядке, то мы можем после сортировки применить метод reverse()
:
users = ["Tom", "Bob", "Alice", "Sam", "Bill"] users.sort() users.reverse() print(users) # ["Tom", "Sam", "Bob", "Bill", "Alice"]
При сортировке фактически сравниваются два объекта, и который из них «меньше», ставится перед тем, который «больше». Понятия «больше» и «меньше» довольно условны. И если для чисел все просто — числа расставляются в порядке возрастания, то для строк и других объектов ситуация сложнее. В частности, строки оцениваются по первым символам. Если первые символы равны, оцениваются вторые символы и так далее. При чем цифровой символ считается «меньше», чем алфавитный заглавный символ, а заглавный символ считается меньше, чем строчный. Подробнее про сравнение строк описывалось в статье Операции со строками.
Таким образом, если в списке сочетаются строки с верхним и нижним регистром, то мы можем получить не совсем корректные результаты, так как для нас строка «bob» должна стоять до строки «Tom». И чтобы изменить стандартное поведение сортировки, мы можем передать в метод sort()
в качестве параметра функцию:
users = ["Tom", "bob", "alice", "Sam", "Bill"] users.sort(key=str.lower) print(users) # ["alice", "Bill", "bob", "Sam", "Tom"]
Кроме метода sort мы можем использовать встроенную функцию sorted, которая имеет две формы:
sorted(list)
: сортирует список listsorted(list, key)
: сортирует список list, применяя к элементам функцию key
users = ["Tom", "bob", "alice", "Sam", "Bill"] sorted_users = sorted(users, key=str.lower) print(sorted_users) # ["alice", "Bill", "bob", "Sam", "Tom"]
При использовании этой функции следует учитывать, что эта функция не изменяет сортируемый список, а все отсортированные элементы она помещает в новый список, который возвращается в качестве результата.