Списки очень удобны как в повседневной жизни, так и в программировании.
Список в python – это тип данных (list), предназначенный для хранения объектов разных типов. Объекты в списках перечисляются через запятую, а сам список ограничивается квадратными скобками. Ниже несколько примеров списков.
1 2 3 | colors = ["red", "green", "blue"] scores = [10, 8, 9, -2, 9] my_list = ["blabla", 2, 3.0] |
Первый список colors состоит из четырех строк. Второй — scores, хранит пять целых чисел. Последний список хранит значения разных типов, строку, целое число и число с плавающей точкой. Списки из объектов разных типов на практике встречаются достаточно редко.
Получить элемент списка так же легко, как и обратится к любому символу в строке.
1 2 3 | >>> colors = ["red", "green", "blue"] >>> print colors[1] green |
Напоминаю, что отчет элементов начинается с 0, таким образом, третий элемент имеет индекс 2. Мы можем получить несколько элементов списка так же как это делалось со строками.
1 2 3 4 5 | >>> colors = ["red", "green", "blue"] >>> print colors ['red', 'green', 'blue'] >>> print colors[0:2] ['red', 'green'] |
Как видно из примера, печать colors[0:2] выводит срез списка.
В отличие от строк, списки являются изменяемыми объектами. Мы можем изменять определенные объекты в списке, например, так:
1 2 3 4 5 | >>> colors = ["red", "green", "blue"] >>> colors[0] = "burgundy" >>> colors[2] = "electric indigo" >>> print colors ['burgundy', 'green', 'electric indigo'] |
Также мы можем добавлять новые элементы в список. В следующем примере мы создаем пустой список, а затем, с помощью метода append добавляем в него объекты.
1 2 3 4 5 6 | >>> animals = [] >>> animals.append("lion") >>> animals.append("tiger") >>> animals.append("frumious Bandersnatch") >>> print animals ['lion', 'tiger', 'frumious Bandersnatch'] |
С помощью метода remove() мы можем удалять объекты из списка:
1 2 3 4 | >> animals.remove("lion") >> animals.remove("tiger") >> print animals ['frumious Bandersnatch'] |
Метод extend() можно использовать для добавления более чем одного нескольких объекта к списку.
1 2 3 4 5 6 7 | >>> cities = [] >>> cities.append("New York") >>> cities ['New York'] >>> cities.extend(["San Francisco", "Boston", "Chicago"]) >>> cities ['New York', 'San Francisco', 'Boston', 'Chicago'] |
Узнать номер объекта в списке можно с помощью метода index().
1 2 3 | >>> colors = ["red", "green", "blue"] >>> print colors.index("green") 1 |
Копирование одного списка в другой тоже интуитивно понятно. Попробовав запустить следующий пример, вы можете быть немного удивлены.
1 2 3 4 5 | >>> animals = ["lion", "tiger", "frumious Bandersnatch"] >>> large_cats = animals >>> large_cats.append("Tigger") >>> print animals ['lion', 'tiger', 'frumious Bandersnatch', 'Tigger'] |
Мы пытаемся присвоить строки в списке animals списку large_cats, и затем добавляем новую строку в список large_cats. После этого выводим содержимое animals и видим, что исходный список изменился.
Мы столкнулись с интересной особенностью объектно-ориентированного программирования. После того, как мы указали что large_cats = animals, оба этих идентификатора стали ссылаться на один и тот же объект, размещенный где-то в памяти компьютера. Операция append() изменила сам объект а не ссылки на него. Чтобы нам все же выполнить копирование списка, нам нужно перебрать все элементы исходного списка, например, таким образом:
1 2 3 4 | >>> animals = ["lion", "tiger", "frumious Bandersnatch"] >>> large_cats = animals[:] >>> large_cats ['lion', 'tiger', 'frumious Bandersnatch'] |
В квадратных скобках после animals указан диапазон элементов списка который мы хотим получить, а затем присвоить новому списку. Так как числа не указаны, то будут выбраны все элементы списка от первого до последнего.
Вы можете получить такой же результат спомощью метода extend()
1 2 3 4 5 | >>> animals = ["lion", "tiger", "frumious Bandersnatch"] >>> large_cats = [] >>> large_cats.extend(animals) >>> large_cats ['lion', 'tiger', 'frumious Bandersnatch'] |
Помните о том, что списки являются изменяемыми объектами, поэтому нет необходимости переприсваивать их при использовании методов. Иными словами, мы используем animals.append(«blabla») а не animals = animals.append(«blabla»), как бы это пришлось делать со строками. Это правило работает для всех методов, принадлежащих изменяемым типам. Например, метод sort(). Он сортирует объекты в списке по возрастанию(в алфавитном или числовом порядке, в зависимости от типа объектов).
1 2 3 | >>> animals.sort() >>> print animals ['frumious Bandersnatch', 'jubjub', 'lion', 'tiger', 'Tigger'] |
Если же мы попытаемся присвоить эту операция списку, то увидим следующую картину:
1 2 3 | >>> animals = animals.sort() >>> print animals None |
Так как списки могут хранить любые объекты, мы можем даже хранить списки в списках. Сделав список списков мы получим обычную двумерную матрицу. Синтаксически это делается таким образом:
1 | >>> two_by_two = [[1, 2], [3, 4]] |
У нас получился список, состоящий из двух объектов, которые сами являются списками. Для обращения к какому-либо элементу по индексу, необходимо сначала указать индекс элемента в родительском списке, а затем — индекс в дочернем. В нашем случае, сначала указываем строку в матрице, а затем столбец.
1 2 | >>> two_by_two[1][0] 3 |
Если мы попробуем получить элемент, находящийся под индексом two_by_two[1], мы получим список [3, 4].
Содержимое списков необязательно должно быть симметричным и равномерным.
1 2 3 | >>> list = ["I heard you like lists", ["so I put a list", "in your list"]] >>> print list ['I heard you like lists', ['so I put a list', 'in your list']] |
Наконец, если мы хотим создать список из строки, разбив ее на символы, мы используем строковый метод split(). В качестве параметра ему передается символ-разделитель. В примере ниже, таковым является запятая c пробелом.
1 2 3 4 | >>> groceries = "eggs, spam, pop rocks, cheese" >>> grocery_list = groceries.split(", ") >>> print grocery_list ['eggs', 'spam', 'pop rocks', 'cheese'] |