Размер списка может меняться во время работы программы питон

Информатика

Erica Erica

1 year(s) ago

ответы: 1

Зарегистрируйтесь, чтобы добавить ответ

Ответ:

Элементы списка могут быть разных типов

Элементы всегда нумеруются с нуля

Размер списка может меняться во время работы программы

173

Teresa Teresa

Oct 28, 2021

Чтобы ответить необходимо зарегистрироваться.

Список в Python —  это набор элементов, следующих в определенном порядке.  Списки позволяют хранить в одном месте данные, сколько бы их не было, один элемент или тысяча элементов. В список можно поместить любую информацию, даже не связанную между собой. Так как список обычно содержит более одного элемента, рекомендуется называть их именем во множественном лице. Списки могут динамически изменять свои размеры, увеличиваясь и изменяясь во время выполнения программы. Кортежи в отличие от списков изменяться не могут. Длина кортежа определяется количеством элементов в нем, и в процессе выполнения программы изменяться не может. Списки и кортежи обладают многими общими возможностями. 

Содержание страницы
1. Создание списка в Python
2.1. Обращение к элементам списка
2.2. Индексы начинаются с 0, а не с 1
3.1. Использование элементов списка в строках
3.2. Использование элементов списка в выражениях
4.1. Изменение элементов в списке
4.2. Добавление элементов в конец списка. Метод append()
4.3. Вставка элемента в список.  Метод insert()
4.4. Удаление элемента в списке командой del()
4.5. Удаление элемента в списке с использованием метода pop()
4.6. Удаление элементов в списке по значению. Метод remove()
4.7. Очистка списка. Метод clear()
5.1. Постоянная сортировка списка методом sort()
5.2. Временная сортировка списка функцией sorted()
6. Определение длины списка. Функция len()
7. Ошибки при работе со списками
8. Кортежи

1. Создание списка в Python.

В языке Python список обозначается квадратными скобками [ ]. В списках обычно хранятся однородные данные, то есть значения одного типа. Пример списка из пяти элементов.

cars = [ ‘audi’, ‘bmw’, ‘ford’, ‘kia’, ‘land rover’ ]

Так же в списках можно хранить разнородные данные, то есть разных типов. Например, в следующем списке хранится имя студента(строка), фамилия(строка), его средняя оценка(float), год окончания заведения(int)

id = [ ‘Jon’, ‘Bond’,  3.54, 2020 ]

2.1. Обращение к элементам списка Python. 

Списки представляют собой упорядоченные наборы данных, поэтому для обращения к элементу списка, нужно сообщить Python позицию(индекс) элемента. Для этого в начале укажите имя списка, а затем индекс элемента в квадратных скобках [ ]

>>> cars = [ ‘audi’, ‘bmw’, ‘ford’, ‘kia’, ‘land rover’ ]
>>> cars
[‘audi’, ‘bmw’, ‘ford’, ‘kia’, ‘land rover’]
>>> cars[1]
‘bmw’
>>> cars[1].title()
‘Bmw’

В первом случае выводится элемент с индексом 1. Во втором случае выводится этот же элемент с заглавной буквы, с помощью метода title().

2.2. Индексы начинаются с 0, а не с 1.

В Python, как и во многих других языках, первый элемент имеет индекс 0, а не 1. Если при выполнении программы, вы получили неожиданный результат, то проверьте не допустили ли вы ошибку по смещению на 1. Второй элемент списка идет под индексом 1. Например, чтобы обратиться к третьему элементу списка, следует запросить элемент с номером 2. В следующем примеры выводятся элементы с индексом 1 и 3.

>>> cars = [ ‘audi’, ‘bmw’, ‘ford’, ‘kia’, ‘land rover’ ]      
>>> cars[1]
‘bmw’
>>> cars[3]
‘kia’

>>> cars[-1]
‘land rover’
>>> cars[-3]
‘ford’

В Python есть возможность для обращения сразу к последнему элементу списка. Для этого нужно запросить элемент с индексом [-1].  Этот синтаксис так же распространяется и на другие отрицательные значения индексов. Индекс [-3] возвращает третий элемент с конца, и т.д.

3.1. Использование элементов списка в строках.

Отдельные элементы списков могут использоваться для построения сообщений. Для этого можно воспользоваться f-строками. Возьмем предыдущий список автомобилей и извлечем из него один элемент.

>>> cars = [ ‘audi’, ‘bmw’, ‘ford’, ‘kia’, ‘land rover’ ]
>>> message = Мой первый автомобиль {cars[2].title()}.«
>>> print(message)
Мой первый автомобиль Ford.

В результате строится сообщение, в котором используется элемент с индексом 2 и сохраняется в переменной. 

3.2. Использование элементов списка в выражениях. 

Элементы списка могут так же использоваться как переменные в выражениях. Предположим, есть список каких-то чисел и вам нужно проделать с ними арифметические операции.

>>> a = [1, 5, 70, 4, 28]
>>> a[0] + a[2]
71
>>> a[2] / a[1]
14.0

4.1. Изменение элементов в списке Python. 

Как правило вы будете создавать динамические списки. Это означает, что во время выполнения программы элементы будут добавляться и удалятся. Изменение элементов в списке Python напоминает синтаксис обращения к элементу списка. Для того чтобы изменить элемент, укажите имя списка и индекс изменяемого элемента в квадратных скобках [ ], затем задайте новое значение, которое присвоится этому элементу. Например, в нашем списке машин мы хотим поменять бренд ‘ford’ на ‘opel’.

>>> cars = [ ‘audi’, ‘bmw’, ‘ford’, ‘kia’, ‘land rover’ ]
>>> cars [2] = ‘opel’
>>> cars
[‘audi’, ‘bmw’, ‘opel’, ‘kia’, ‘land rover’]

4.2. Добавление элементов в конец списка Python. Метод append(). 

Самый простой способ добавление элемента в список — это присоединение его в конец списка. Для этого используется метод append(). Метод append() присоединяет элемент в конец списка, при этом остальные элементы списка не изменяются и не сдвигаются. 

>>> cars = [ ‘audi’, ‘bmw’, ‘ford’, ‘kia’, ‘land rover’ ]
>>> cars.append(‘opel’)
>>> print(cars)
[‘audi’, ‘bmw’, ‘ford’, ‘kia’, ‘land rover’, ‘opel’]

Если вы хотите начать с пустого списка и добавлять в него элементы, то так же рекомендуется использовать метод append().  Данные, которые захочет сохранить пользователь часто не известны после запуска программы. Создайте для него пустой список, а затем присоединяйте новые данные. 

>>> cars = [ ]
>>> cars.append(‘audi’)
>>> cars.append(‘bmw’)
>>> cars.append(‘kia’)
>>> cars.append(‘land rover’)
>>> print(cars)
[‘audi’, ‘bmw’, ‘kia’, ‘land rover’]

4.3. Вставка элемента в список Python.  Метод insert().

Для вставки элемента в определенную позицию списка существует метод insert(). Для этого следует указать индекс и значение нового элемента.

>>> cars = [ ‘audi’, ‘bmw’, ‘ford’, ‘kia’, ‘land rover’ ]
>>> cars.insert(0, ‘opel’)
>>> print(cars)
[‘opel’, ‘audi’, ‘bmw’, ‘ford’, ‘kia’, ‘land rover’]

В этом примере значение ‘opel’ вставляется в начало списка, а все остальные значения при этом сдвигаются на одну позицию индекса.

4.4. Удаление элемента в списке командой del(). 

Если вы знаете индекс элемента, который нужно удалить, то легко можно воспользоваться командой del(). Команда del() позволяет удалить любой элемент из любой позиции списка. 

>>> cars = [ ‘audi’, ‘bmw’, ‘ford’, ‘kia’, ‘land rover’ ]
>>> del cars[2]
>>> print(cars)
[‘audi’, ‘bmw’, ‘kia’, ‘land rover’]
>>> del cars[0]
>>> print(cars)
[‘bmw’, ‘kia’, ‘land rover’]

При выполнении команды del() элемент удаляется навсегда.

4.5. Удаление элемента списка с использованием метода pop().

Не всегда требуется удаление элемента из списка навсегда. Например, в веб-приложение пользователь из списка активных участников, переходит в список не активных. Метод pop() удаляет элемент из списка, но позволяет с ним еще работать после удаления. 

>>> cars = [ ‘audi’, ‘bmw’, ‘ford’, ‘kia’, ‘land rover’ ]
>>> sale = cars.pop(3)
>>> print(f»Автомобиль марки {sale.title()} сегодня был продан.»)
Автомобиль марки  Kia  сегодня был продан.
>>> cars
[‘audi’, ‘bmw’, ‘ford’, ‘land rover’]

Сначала элемент извлекается из списка методом pop() и сохраняется в переменной sale. Затем эта переменная уже используется для вывода сообщения с помощью f-строки.

После каждого использования метода pop() элемент удаляется из списка.

4.6. Удаление элементов списка по значению. Метод remove()

Когда индекс удаляемого элемента не известен, но вы знаете значение этого элементы, можно воспользоваться методом remove(). Предположим, нам нужно удалить из списка автомобиль ford. Ниже в примере значение ford удаляется из списка.

>>> cars = [ ‘audi’, ‘bmw’, ‘ford’, ‘kia’, ‘land rover’ ]
>>> cars.remove(‘ford’)
>>> cars
[‘audi’, ‘bmw’, ‘kia’, ‘land rover’]

Важно: Метод remove() удаляет только первое вхождение заданного значение в списке. Если в списке значения могут повторяться, то нужно воспользоваться циклом для перебора.

4.7. Очистка списка. Метод clear().

Чтобы удалить все элементы списка используйте метод clear().

>>> cars = [ ‘ford’, ‘opel’, ‘audi’, ‘land rover’, ‘bmw’ ]
>>> cars.clear()
>>> print(cars)
[]

5.1. Постоянная сортировка списка методом sort(). 

Списки в Python легко отсортировать. Для этого есть метод sort(). Данный метод сортирует элементы по алфавиту. Если список состоит из чисел, то отсортирует их по возрастанию.

>>> cars = [ ‘ford’, ‘opel’, ‘audi’, ‘land rover’, ‘bmw’ ]
>>> cars.sort()
>>> print(cars)
[‘audi’, ‘bmw’, ‘ford’, ‘land rover’, ‘opel’]
>>> a = [ 560, 25, 452, 14, 945, 643, 1, -42, -5 ]
>>> a.sort()
>>> print(a)
[-42, -5, 1, 14, 25, 452, 560, 643, 945]

Чтобы отсортировать список по убыванию, в методе sort() используйте не обязательный аргумент reverse.(reverse=True)

>>> cars.sort(reverse=True)
>>> print(cars)
[‘opel’, ‘land rover’, ‘ford’, ‘bmw’, ‘audi’]

Метод sort() изменяет список и вернутся к исходному порядку не получится. 

5.2. Временная сортировка списка функцией sorted().

Для того чтобы исходный список не менялся, но для удобства работы вы могли получить отсортированный список, существует функция sorted(). Функция sorted() возвращает список в отсортированном порядке.

>>> cars = [ ‘ford’, ‘opel’, ‘audi’, ‘land rover’, ‘bmw’ ]
>>> print(sorted(cars))
[‘audi’, ‘bmw’, ‘ford’, ‘land rover’, ‘opel’]
>>> print(cars)
[‘ford’, ‘opel’, ‘audi’, ‘land rover’, ‘bmw’]

На примере видно, что исходный список cars остался прежним и не изменился. 

6. Определение длины списка. Функция len().

Для того чтобы быстро определить длину списка используйте функцию len()

>>> cars = [ ‘ford’, ‘opel’, ‘audi’, ‘land rover’, ‘bmw’ ]
>>> print(len(cars))
5

7. Ошибки при работе со списками Python

Одна из основных ошибок при работе со списками, это ошибка индексирования. Например, вы пытаетесь вернуть элемент с индексом 5. В результате Python при работе со списком не находит элемент с этим индексом, происходит ошибка индексирования

>>> cars = [ ‘audi’, ‘bmw’, ‘ford’, ‘kia’, ‘land rover’ ]         
>>> cars [5]
Traceback (most recent call last):
  File «<stdin>», line 1, in <module>
IndexError: list index out of range

Индекс должен быть целым числом или выражением, дающим целочисленный результат. При попытке использования нецелочисленного индекса происходит ошибка TypeError. Так же ошибка индексирования образуется при попытке обратиться к элементу пустого списка.

8. Кортежи в Python. 

Когда требуется создать не изменяемый список, на помощь приходят кортежи. В кортежах часто хранятся разнородные данные, но данные также могут быть однородными. Длина кортежа определяется количеством элементов в кортеже и не может меняться во время выполнения программы. Кортеж выглядит как список, но вместо квадратных скобок используются круглые ( ).  При выводе кортежа Python  отображает его содержимое в круглых скобках. Для упаковки элементов в кортеж можно перечислить их через запятую. 

>>> student = ()
>>> len(student)
0
>>> student = ‘Ivan’, ‘Ivanov’, 3.5
>>> print(student)
(‘Ivan’, ‘Ivanov’, 3.5)
>>> print(student[1])
Ivanov

Обращаться к отдельным элементам можно по индексам также как и в списках. Попробуем изменить один элемент кортежа и посмотрим, что произойдет. 

>>> student[1] = ‘Petrov’
Traceback (most recent call last):
  File «<stdin>», line 1, in <module>
TypeError: ‘tuple’ object does not support item assignment

Когда вы захотите изменить элемент в кортеже, Python выдаст ошибку о невозможности изменения элементов.  TypeError: ‘tuple’ object does not support item assignment.

Далее: Сегментация последовательностей

Назад: Строки и функция print в Python

Одна из ключевых особенностей Python, благодаря которой он является таким популярным – это простота. Особенно подкупает простота работы с различными структурами данных – списками, кортежами, словарями и множествами. Сегодня мы рассмотрим работу со списками.

Список (list) – это структура данных для хранения объектов различных типов. Если вы использовали другие языки программирования, то вам должно быть знакомо понятие массива. Так вот, список очень похож на массив, только, как было уже сказано выше, в нем можно хранить объекты различных типов. Размер списка не статичен, его можно изменять. Список по своей природе является изменяемым типом данных. Про типы данных можно подробно прочитать здесь. Переменная, определяемая как список, содержит ссылку на структуру в памяти, которая в свою очередь хранит ссылки на какие-либо другие объекты или структуры.

Как списки хранятся в памяти?

Как уже было сказано выше, список является изменяемым типом данных. При его создании в памяти резервируется область, которую можно условно назвать некоторым “контейнером”, в котором хранятся ссылки на другие элементы данных в памяти. В отличии от таких типов данных как число или строка, содержимое “контейнера” списка можно менять. Для того, чтобы лучше визуально представлять себе этот процесс взгляните на картинку ниже. Изначально был создан список содержащий ссылки на объекты 1 и 2, после операции a[1] = 3, вторая ссылка в списке стала указывать на объект 3.

Пример изменяемого объекта

Более подробно эти вопросы обсуждались в уроке 3 (Типы и модель данных).

Создание, изменение, удаление списков и работа с его элементами

Создать список можно одним из следующих способов.

>>> a = [] 
>>> type(a) 
<class 'list'> 
>>> b = list() 
>>> type(b) 
<class 'list'>

Также можно создать список с заранее заданным набором данных.

>>> a = [1, 2, 3] 
>>> type(a) 
<class 'list'>

Если у вас уже есть список и вы хотите создать его копию, то можно воспользоваться следующим способом:

>>> a = [1, 3, 5, 7] 
>>> b = a[:] 
>>> print(a) 
[1, 3, 5, 7] 
>>> print(b) 
[1, 3, 5, 7]

или сделать это так:

>>> a = [1, 3, 5, 7] 
>>> b = list(a) 
>>> print(a) 
[1, 3, 5, 7] 
>>> print(b) 
[1, 3, 5, 7]

В случае, если вы выполните простое присвоение списков друг другу, то переменной b будет присвоена ссылка на тот же элемент данных в памяти, на который ссылается a, а не копия списка а. Т.е. если вы будете изменять список a, то и b тоже будет меняться.

>>> a = [1, 3, 5, 7] 
>>> b = a 
>>> print(a) 
[1, 3, 5, 7] 
>>> print(b) 
[1, 3, 5, 7] 
>>> a[1] = 10 
>>> print(a) 
[1, 10, 5, 7] 
>>> print(b) 
[1, 10, 5, 7]

Добавление элемента в список осуществляется с помощью метода append().

>>> a = [] 
>>> a.append(3) 
>>> a.append("hello") 
>>> print(a) 
[3, 'hello']

Для удаления элемента из списка, в случае, если вы знаете его значение, используйте метод remove(x), при этом будет удалена первая ссылка на данный элемент.

>>> b = [2, 3, 5] 
>>> print(b) 
[2, 3, 5] 
>>> b.remove(3) 
>>> print(b) 
[2, 5]

Если необходимо удалить элемент по его индексу, воспользуйтесь командой del имя_списка[индекс].

>>> c = [3, 5, 1, 9, 6] 
>>> print(c) 
[3, 5, 1, 9, 6] 
>>> del c[2] 
>>> print(c) 
[3, 5, 9, 6]

Изменить значение элемента списка, зная его индекс, можно напрямую к нему обратившись.

>>> d = [2, 4, 9] 
>>> print(d) 
[2, 4, 9] 
>>> d[1] = 17 
>>> print(d) 
[2, 17, 9]

Очистить список можно просто заново его проинициализировав, так как будто вы его вновь создаете. Для получения доступа к элементу списка укажите индекс этого элемента в квадратных скобках.

>>> a = [3, 5, 7, 10, 3, 2, 6, 0] 
>>> a[2] 
7

Можно использовать отрицательные индексы, в таком случае счет будет идти с конца, например для доступа к последнему элементу списка можно использовать вот такую команду:

>>> a[-1] 
0

Для получения из списка некоторого подсписка в определенном диапазоне индексов, укажите начальный и конечный индекс в квадратных скобках, разделив их двоеточием.

>>> a[1:4] 
[5, 7, 10]

Методы списков

list.append(x)

Добавляет элемент в конец списка. Ту же операцию можно сделать так a[len(a):] = [x].

>>> a = [1, 2] 
>>> a.append(3) 
>>> print(a) 
[1, 2, 3]

list.extend(L)

Расширяет существующий список за счет добавления всех элементов из списка L. Эквивалентно команде a[len(a):] = L.

>>> a = [1, 2] 
>>> b = [3, 4] 
>>> a.extend(b) 
>>> print(a) 
[1, 2, 3, 4]

list.insert(i, x)

Вставить элемент x в позицию i.  Первый аргумент – индекс элемента после которого будет вставлен элемент x.

>>> a = [1, 2] 
>>> a.insert(0, 5) 
>>> print(a) 
[5, 1, 2] 
>>> a.insert(len(a), 9) 
>>> print(a) 
[5, 1, 2, 9]

list.remove(x)

Удаляет первое вхождение элемента x из списка.

>>> a = [1, 2, 3] 
>>> a.remove(1) 
>>> print(a) 
[2, 3]

list.pop([i])

Удаляет элемент из позиции i и возвращает его. Если использовать метод без аргумента, то будет удален последний элемент из списка.

>>> a = [1, 2, 3, 4, 5] 
>>> print(a.pop(2)) 
3 
>>> print(a.pop()) 
5 
>>> print(a) 
[1, 2, 4]

list.clear()

Удаляет все элементы из списка. Эквивалентно del a[:].

>>> a = [1, 2, 3, 4, 5] 
>>> print(a) 
[1, 2, 3, 4, 5] 
>>> a.clear() 
>>> print(a) 
[]

list.index(x[, start[, end]])

Возвращает индекс элемента.

>>> a = [1, 2, 3, 4, 5] 
>>> a.index(4) 
3

list.count(x)

Возвращает количество вхождений элемента x в список.

>>> a=[1, 2, 2, 3, 3] 
>>> print(a.count(2)) 
2

list.sort(key=None, reverse=False)

Сортирует элементы в списке по возрастанию. Для сортировки в обратном порядке используйте флаг reverse=True. Дополнительные возможности открывает параметр key, за более подробной информацией обратитесь к документации.

>>> a = [1, 4, 2, 8, 1] 
>>> a.sort() 
>>> print(a) 
[1, 1, 2, 4, 8]

list.reverse()

Изменяет порядок расположения элементов в списке на обратный.

>>> a = [1, 3, 5, 7] 
>>> a.reverse() 
>>> print(a) 
[7, 5, 3, 1]

list.copy()

Возвращает копию списка. Эквивалентно a[:].

>>> a = [1, 7, 9] 
>>> b = a.copy() 
>>> print(a) 
[1, 7, 9] 
>>> print(b) 
[1, 7, 9] 
>>> b[0] = 8 
>>> print(a) 
[1, 7, 9] 
>>> print(b) 
[8, 7, 9]

List Comprehensions

List Comprehensions чаще всего на русский язык переводят как  абстракция списков или списковое включение, является частью синтаксиса языка, которая предоставляет простой способ построения списков. Проще всего работу list comprehensions показать на примере. Допустим вам необходимо создать список целых чисел от 0 до n, где n предварительно задается. Классический способ решения данной задачи выглядел бы так:

>>> n = int(input())
7
>>> a=[]
>>> for i in range(n):
        a.append(i)

>>> print(a)
[0, 1, 2, 3, 4, 5, 6]

Использование list comprehensions позволяет сделать это значительно проще:

>>> n = int(input())
7
>>> a = [i for i in range(n)]
>>> print(a)
[0, 1, 2, 3, 4, 5, 6]

или вообще вот так, в случае если вам не нужно больше использовать n:

>>> a = [i for i in range(int(input()))]
7
>>> print(a)
[0, 1, 2, 3, 4, 5, 6]

List Comprehensions как обработчик списков

В языке Python есть две очень мощные функции для работы с коллекциями: map и filter. Они позволяют использовать функциональный стиль программирования, не прибегая к помощи циклов, для работы с такими типами как list, tuple, set, dict и т.п. Списковое включение позволяет обойтись без этих функций. Приведем несколько примеров для того, чтобы понять о чем идет речь.

Пример с заменой функции map.

Пусть у нас есть список и нужно получить на базе него новый, который содержит элементы первого, возведенные в квадрат. Решим эту задачу с использованием циклов:

>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> b = []
>>> for i in a:
        b.append(i**2)

>>> print('a = {}nb = {}'.format(a, b))
a = [1, 2, 3, 4, 5, 6, 7]
b = [1, 4, 9, 16, 25, 36, 49]

Та же задача, решенная с использованием map, будет выглядеть так:

>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> b = list(map(lambda x: x**2, a))
>>> print('a = {}nb = {}'.format(a, b))
a = [1, 2, 3, 4, 5, 6, 7]
b = [1, 4, 9, 16, 25, 36, 49]

В данном случае применена lambda-функция, о том, что это такое и как ее использовать можете прочитать здесь.

Через списковое включение эта задача будет решена так:

>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> b = [i**2 for i in a]
>>> print('a = {}nb = {}'.format(a, b))
a = [1, 2, 3, 4, 5, 6, 7]
b = [1, 4, 9, 16, 25, 36, 49]

Пример с заменой функции filter.

Построим на базе существующего списка новый, состоящий только из четных чисел:

>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> b = []
>>> for i in a:
        if i%2 == 0:
            b.append(i)

>>> print('a = {}nb = {}'.format(a, b))
a = [1, 2, 3, 4, 5, 6, 7]
b = [2, 4, 6]

Решим эту задачу с использованием filter:

>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> b = list(filter(lambda x: x % 2 == 0, a))
>>> print('a = {}nb = {}'.format(a, b))
a = [1, 2, 3, 4, 5, 6, 7]
b = [2, 4, 6]

Решение через списковое включение:

>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> b = [i for i in a if i % 2 == 0]
>>> print('a = {}nb = {}'.format(a, b))
a = [1, 2, 3, 4, 5, 6, 7]
b = [2, 4, 6]

Слайсы / Срезы

Слайсы (срезы) являются очень мощной составляющей Python, которая позволяет быстро и лаконично решать задачи выборки элементов из списка. Выше уже был пример использования слайсов, здесь разберем более подробно работу с ними. Создадим список для экспериментов:

>>> a = [i for i in range(10)]

Слайс задается тройкой чисел, разделенных запятой: start:stop:step. Start – позиция с которой нужно начать выборку, stop – конечная позиция, step – шаг. При этом необходимо помнить, что выборка не включает элемент определяемый stop.

Рассмотрим примеры:

>>> # Получить копию списка
>>> a[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> # Получить первые пять элементов списка
>>> a[0:5]
[0, 1, 2, 3, 4]

>>> # Получить элементы с 3-го по 7-ой
>>> a[2:7]
[2, 3, 4, 5, 6]

>>> # Взять из списка элементы с шагом 2
>>> a[::2]
[0, 2, 4, 6, 8]

>>> # Взять из списка элементы со 2-го по 8-ой с шагом 2
>>> a[1:8:2]
[1, 3, 5, 7]

Слайсы можно сконструировать заранее, а потом уже использовать по мере необходимости. Это возможно сделать, в виду того, что слайс – это объект класса slice. Ниже приведен пример, демонстрирующий эту функциональность:

>>> s = slice(0, 5, 1)
>>> a[s]
[0, 1, 2, 3, 4]

>>> s = slice(1, 8, 2)
>>> a[s]
[1, 3, 5, 7]

Типо “List Comprehensions”… в генераторном режиме

Есть ещё одни способ создания списков, который похож на списковое включение, но результатом работы является не объект класса list, а генератор. Подробно про генераторы написано в “Уроке 15. Итераторы и генераторы“.

Предварительно импортируем модуль sys, он нам понадобится:

>>> import sys

Создадим список, используя списковое включение :

>>> a = [i for i in range(10)]

проверим тип переменной a:

>>> type(a)
<class 'list'>

и посмотрим сколько она занимает памяти в байтах:

>>> sys.getsizeof(a)
192

Для создания объекта-генератора, используется синтаксис такой же как и для спискового включения, только вместо квадратных скобок используются круглые:

>>> b = (i for i in range(10))

>>> type(b)
<class 'generator'>

>>> sys.getsizeof(b)
120

Обратите внимание, что тип этого объекта ‘generator’, и в памяти он занимает места меньше, чем список, это объясняется тем, что в первом случае в памяти хранится весь набор чисел от 0 до 9, а во втором функция, которая будет нам генерировать числа от 0 до 9. Для наших примеров разница в размере не существенна, рассмотрим вариант с 10000 элементами:

>>> c = [i for i in range(10000)]

>>> sys.getsizeof(c)
87624

>>> d = (i for i in range(10000))

>>> sys.getsizeof(d)
120

Сейчас уже разница существенна, как вы уже поняли, размер генератора в данном случае не будет зависеть от количества чисел, которые он должен создать.

Если вы решаете задачу обхода списка, то  принципиальной разницы между списком и генератором не будет:

>>> for val in a:
        print(val, end=' ')

0 1 2 3 4 5 6 7 8 9 

>>> for val in b:
        print(val, end=' ')

0 1 2 3 4 5 6 7 8 9

Но с генератором нельзя работать также как и со списком: нельзя обратиться к элементу по индексу и т.п.

P.S.

Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. На нашем сайте вы можете найти вводные уроки по этой теме. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.
Книга: Pandas. Работа с данными

<<< Python. Урок 6. Работа с IPython и Jupyter Notebook   Python. Урок 8. Кортежи (tuple) >>>

«Python Последнее обновление 18 марта 2019 08:08:41 (UTC / GMT +8 часов)

script1adsense2code

script1adsense3code

Список

Список — это контейнер, в котором значения, разделенные запятыми (элементы или элементы), заключены в квадратные скобки, где не обязательно, чтобы все элементы или элементы имели одинаковый тип.

В общем, мы можем определить список как объект, который содержит несколько элементов данных (элементов). Содержимое списка может быть изменено во время выполнения программы. Размер списка также может изменяться во время выполнения, так как элементы добавляются или удаляются из него.

«Python

Примечание. Существует множество языков программирования, которые позволяют нам создавать массивы, которые являются объектами, похожими на списки. Списки служат той же цели, что и массивы, и имеют гораздо больше встроенных возможностей. Традиционные массивы не могут быть созданы в Python.

Примеры списков:

  • числа = [10, 20, 30, 40, 50]
  • names = [«Сара», «Дэвид», «Уорнер», «Сэнди»]
  • student_info = [«Сара», 1, «Химия»]

Содержание:

  • Создать список Python
  • Список индексов
  • Добавить элемент в конец списка
  • Вставить элемент в заданную позицию
  • Изменить элемент с помощью индекса элемента
  • Удалить элемент из списка
  • Удалить все элементы из списка
  • Элементы среза из списка
  • Удалить элемент в указанной позиции в списке и вернуть его
  • Вернуть индекс в списке первого элемента, значение которого равно x
  • Вернуть количество раз, когда «х» появляются в списке
  • Сортировать элементы списка на месте
  • Поменяйте местами элементы списка
  • Вернуть мелкую копию списка
  • Поиск в списках и найти элементы
  • Списки изменчивы
  • Преобразовать список в кортеж в Python
  • Как использовать двойное двоеточие [::]?
  • Найти самые большие и самые маленькие предметы в списке
  • Сравнить два списка в Python?
  • Вложенные списки в Python
  • Как я могу получить индекс элемента, содержащегося в списке?
  • Использование списков в качестве стеков
  • Использование списков в качестве очередей
  • Упражнения по списку Python

Создать список Python

Следующий список содержит все целочисленные значения:

>>> my_list1 = [5, 12, 13, 14] # the list contains all integer values
>>> print(my_list1)
[5, 12, 13, 14]
>>>

Следующий список содержит всю строку:

>>> my_list2 = ['red', 'blue', 'black', 'white'] # the list contains all string
values
>>> print(my_list2)
['red', 'blue', 'black', 'white']
>>>

Следующий список содержит строку, целое число и значения с плавающей точкой:

>>> my_list3 = ['red', 12, 112.12] # the list contains a string, an integer and
a float values
>>> print(my_list3)
['red', 12, 112.12]
>>>

Список без какого-либо элемента называется пустым списком. Смотрите следующие утверждения.

>>> my_list=[]
>>> print(my_list)
[]
>>>

Используйте оператор +, чтобы создать новый список, который представляет собой объединение двух списков, и используйте оператор *, чтобы повторить список. Смотрите следующие утверждения.

>>> color_list1 = ["White", "Yellow"]
>>> color_list2 = ["Red", "Blue"]
>>> color_list3 = ["Green", "Black"]
>>> color_list = color_list1 + color_list2 + color_list3
>>> print(color_list)
['White', 'Yellow', 'Red', 'Blue', 'Green', 'Black']
>>> number = [1,2,3]
>>> print(number[0]*4)
4
>>> print(number*4)
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
>>>

Список индексов

Индексы списков работают так же, как строковые индексы, индексы списков начинаются с 0. Если индекс имеет положительное значение, он считается с начала и аналогичным образом считается обратным, если индекс имеет отрицательное значение. Как положительные целые числа используются для индексации с левого конца, так и отрицательные целые числа используются для индексации с правого конца, поэтому каждый элемент списка дает два альтернативных индекса. Давайте создадим список под названием color_list с четырьмя элементами.
color_list = [«RED», «Blue», «Green», «Black»]

Вещь RED синий зеленый черный
Индекс (слева) 0 1 2 3
Индекс (справа) -4 -3 -2 -1

Если вы дадите какое-либо значение индекса, выходящее за пределы диапазона, интерпретатор создаст сообщение об ошибке. Смотрите следующие утверждения.

>>> color_list=["Red", "Blue", "Green", "Black"] # The list have four elements
indices start at 0 and end at 3
>>> color_list[0] # Return the First Element
'Red'
>>> print(color_list[0],color_list[3]) # Print First and Last Elements
Red Black
>>> color_list[-1] # Return Last Element
'Black'
>>> print(color_list[4]) # Creates Error as the indices is out of range
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>>

Добавить элемент в конец списка

«Python

Смотрите следующие заявления:

>>> color_list=["Red", "Blue", "Green", "Black"]
>>> print(color_list)
['Red', 'Blue', 'Green', 'Black']
>>> color_list.append("Yellow")
>>> print(color_list)
['Red', 'Blue', 'Green', 'Black', 'Yellow']
>>>

Вставить элемент в заданную позицию

«Python

Смотрите следующие заявления:

>>> color_list=["Red", "Blue", "Green", "Black"]
>>> print(color_list)
['Red', 'Blue', 'Green', 'Black']
>>> color_list.insert(2, "White") #Insert an item at third position
>>> print(color_list)
['Red', 'Blue', 'White', 'Green', 'Black']
>>>

Изменить элемент с помощью индекса элемента

«Python

Смотрите следующие заявления:

>>> color_list=["Red", "Blue", "Green", "Black"]
>>> print(color_list)
['Red', 'Blue', 'Green', 'Black']
>>> color_list[2]="Yellow"  #Change the third color
>>> print(color_list)
['Red', 'Blue', 'Yellow', 'Black']
>>>

Удалить элемент из списка

«Python

Смотрите следующие заявления:

>>> color_list=["Red", "Blue", "Green", "Black"]
>>> print(color_list)
['Red', 'Blue', 'Green', 'Black']
>>> color_list.remove("Black")
>>> print(color_list)
['Red', 'Blue', 'Green']

Удалить все элементы из списка

«Python

Смотрите следующие заявления:

>>> color_list=["Red", "Blue", "Green", "Black"]
>>> print(color_list)
['Red', 'Blue', 'Green', 'Black']
>>> color_list.clear()
>>> print(color_list)
[]
>>>

Список ломтиков

Списки могут быть разрезаны как строки и другие последовательности.

Синтаксис:

 sliced_list = List_Name [startIndex: endIndex]

Это относится к элементам списка, начиная с индекса startIndex и заканчивая непосредственно перед индексом endIndex. Значениями по умолчанию для списка являются 0 (startIndex) и конец (endIndex) списка. Если вы пропустите оба индекса, срез создаст копию исходного списка.

Вырежьте первые два элемента из списка:

«Python

Смотрите следующие заявления:

>>> color_list=["Red", "Blue", "Green", "Black"] # The list have four elements 
indices start at 0 and end at 3
>>> print(color_list[0:2]) # cut first two items
['Red', 'Blue']
>>>

Вырезать второй элемент из списка:

«Python

Смотрите следующие заявления:

>>> color_list=["Red", "Blue", "Green", "Black"] # The list have four elements 
indices start at 0 and end at 3
>>> print(color_list[1:2])
['Blue']
>>> print(color_list[1:-2])
['Blue']
>>>

Вырежьте второй и третий элементы из списка:

«Python

Смотрите следующие заявления:

>>> color_list=["Red", "Blue", "Green", "Black"] # The list have four elements 
indices start at 0 and end at 3
>>> print(color_list[1:-1])
['Blue', 'Green']
>>>

Вырежьте первые три элемента из списка:

«Python

Смотрите следующие заявления:

>>> color_list=["Red", "Blue", "Green", "Black"] # The list have four elements 
indices start at 0 and end at 3
>>> print(color_list[:3]) # cut first three items
['Red', 'Blue', 'Green']
>>>

Создает копию оригинального списка:

«Python

Смотрите следующие заявления:

>>> color_list=["Red", "Blue", "Green", "Black"] # The list have four elements 
indices start at 0 and end at 3
>>> print(color_list[:]) # Creates copy of original list
['Red', 'Blue', 'Green', 'Black']
>>>

Удалить элемент в указанной позиции в списке и вернуть его

«Python

Смотрите следующие заявления:

>>> color_list=["Red", "Blue", "Green", "Black"]
>>> print(color_list)
['Red', 'Blue', 'Green', 'Black']
>>> color_list.pop(2) # Remove second item and return it
'Green'
>>> print(color_list)
['Red', 'Blue', 'Black']
>>>

Вернуть индекс в списке первого элемента, значение которого равно x

«Python

Смотрите следующие заявления:

>>> color_list=["Red", "Blue", "Green", "Black"]
>>> print(color_list)
['Red', 'Blue', 'Green', 'Black']
>>> color_list.index("Red")
0
>>> color_list.index("Black")
3
>>>

Вернуть количество раз, когда «х» появляются в списке

«Python

Смотрите следующие заявления:

>>> color_list=["Red", "Blue", "Green", "Black"]
>>> print(color_list)
['Red', 'Blue', 'Green', 'Black']
>>> color_list=["Red", "Blue", "Green", "Black", "Blue"]
>>> print(color_list)
['Red', 'Blue', 'Green', 'Black', 'Blue']
>>> color_list.count("Blue")
2
>>>

Сортировать элементы списка на месте

«Python

Смотрите следующие заявления:

>>> color_list=["Red", "Blue", "Green", "Black"]
>>> print(color_list)
['Red', 'Blue', 'Green', 'Black']
>>> color_list.sort(key=None, reverse=False)
>>> print(color_list)
['Black', 'Blue', 'Green', 'Red']
>>>

Поменяйте местами элементы списка

>>> color_list=["Red", "Blue", "Green", "Black"]
>>> print(color_list)
['Red', 'Blue', 'Green', 'Black']
>>> color_list.reverse()
>>> print(color_list)
['Black', 'Green', 'Blue', 'Red']
>>>

Вернуть мелкую копию списка

>>> color_list=["Red", "Blue", "Green", "Black"]
>>> print(color_list)
['Red', 'Blue', 'Green', 'Black']
>>> color_list.copy()
['Red', 'Blue', 'Green', 'Black']
>>>

Поиск в списках и найти элементы

>>> color_list=["Red", "Blue", "Green", "Black"]
>>> print(color_list)
['Red', 'Blue', 'Green', 'Black']
>>> color_list.index("Green")
2
>>>

Списки изменчивы

Элементы в списке являются изменяемыми, т.е. после создания списка вы можете изменить любой элемент в списке. Смотрите следующие утверждения.

>>> color_list=["Red", "Blue", "Green", "Black"]
>>> print(color_list[0])
Red
>>> color_list[0]="White" # Change the value of first item "Red" to "White"
>>> print(color_list)
['White', 'Blue', 'Green', 'Black']
>>> print(color_list[0])
White
>>>

Преобразовать список в кортеж в Python

>>> listx = [1, 2, 3, 4]  
>>> print(listx)  
[1, 2, 3, 4]  
>>> tuplex = tuple(listx)  
>>> print(tuplex)  
(1, 2, 3, 4)   
>>>

Как использовать двойное двоеточие [::]?

>>> listx=[1, 5, 7, 3, 2, 4, 6]
>>> print(listx)
[1, 5, 7, 3, 2, 4, 6]
>>> sublist=listx[2:7:2] #list[start:stop:step], #step specify an increment
between the elements to cut of the list.
>>> print(sublist)
[7, 2, 6]
>>> sublist=listx[::3] #returns a list with a jump every 2 times.
>>> print(sublist)
[1, 3, 6]
>>> sublist=listx[6:2:-2] #when step is negative the jump is made back
>>> print(sublist)
[6, 2]
>>>

Найти самый большой и самый маленький элемент в списке

>>> listx=[5, 10, 3, 25, 7, 4, 15]
>>> print(listx)
[5, 10, 3, 25, 7, 4, 15]
>>> print(max(listx))	# the max() function of built-in allows to know the highest
value in the list.
25
>>> print(min(listx)) #the min() function of built-in allows to know the lowest
value in the list.
3
>>>

Сравните два списка в Python

>>> listx1, listx2=[3, 5, 7, 9], [3, 5, 7, 9]
>>> print (listx1 == listx2)
True
>>> listx1, listx2=[9, 7, 5, 3], [3, 5, 7, 9]	#create two lists equal, but unsorted.
>>> print(listx1 == listx2)
False
>>> listx1, listx2 =[2, 3, 5, 7], [3, 5, 7, 9]	#create two different list
>>> print(listx1 == listx2)
False
>>> print(listx1.sort() == listx2.sort())	#order and compare
True
>>>

Вложенные списки в Python

>>> listx = [["Hello", "World"], [0, 1, 2, 3, 4, 5]]
>>> print(listx)
[['Hello', 'World'], [0, 1, 2, 3, 4, 5]]
>>> listx = [["Hello", "World"], [0, 1, 2, 3, 3, 5]]
>>> print(listx)
[['Hello', 'World'], [0, 1, 2, 3, 3, 5]]
>>> print(listx[0][1])		#The first [] indicates the index of the outer list.
World
>>> print(listx[1][3])		#the second [] indicates the index nested lists.
3
>>> listx.append([True, False])		#add new items
>>> print(listx)
[['Hello', 'World'], [0, 1, 2, 3, 3, 5], [True, False]]		
>>> listx[1][2]=4
>>> print(listx)
[['Hello', 'World'], [0, 1, 4, 3, 3, 5], [True, False]]		#update value items
>>>

Как я могу получить индекс элемента, содержащегося в списке?

>>> listy = list("HELLO WORLD")
>>> print(listy)
['H', 'E', 'L', 'L', 'O', ' ', 'W', 'O', 'R', 'L', 'D']
>>> index = listy.index("L")	#get index of the first item whose value is passed as parameter
>>> print(index)
2
>>> index = listy.index("L", 4)	#define the index from which you want to search
>>> print(index)
9
>>> index = listy.index("O", 3, 5)	#define the segment of the list to be searched
>>> print(index)
4
>>>

Использование списков в качестве стеков

>>> color_list=["Red", "Blue", "Green", "Black"]
>>> print(color_list)
['Red', 'Blue', 'Green', 'Black']
>>> color_list.append("White")
>>> color_list.append("Yellow")
>>> print(color_list)
['Red', 'Blue', 'Green', 'Black', 'White', 'Yellow']
>>> color_list.pop()
'Yellow'
>>> color_list.pop()
'White'
>>> color_list.pop()
'Black'
>>> color_list
['Red', 'Blue', 'Green']
>>>

Использование списков в качестве очередей

>>> from collections import deque
>>> color_list = deque(["Red", "Blue", "Green", "Black"])
>>> color_list.append("White")      # White arrive
>>> print(color_list)
deque(['Red', 'Blue', 'Green', 'Black', 'White'])
>>> color_list.append("Yellow")     # Yellow arrive
>>> print(color_list)
deque(['Red', 'Blue', 'Green', 'Black', 'White', 'Yellow'])
>>> color_list.popleft()            # The first to arrive now leaves
'Red'
>>> print(color_list)
deque(['Blue', 'Green', 'Black', 'White', 'Yellow'])
>>> color_list.popleft()            # The second to arrive now leaves
'Blue'
>>> print(color_list)
deque(['Green', 'Black', 'White', 'Yellow'])
>>> print(color_list)               # Remaining queue in order of arrival
deque(['Green', 'Black', 'White', 'Yellow'])
>>>

Предыдущая: Форматирование строки Python
Далее: Словарь Python

8.1. Встроенный тип list

Список (англ.: list) есть упорядоченный набор значений, где каждое значение доступно по индексу. Значения, входящие в список, называются элементами.

Списки похожи на строки, так как строки тоже являются упорядоченными наборами элементов — символов. Но в отличие от строк, элементы списка могут быть любых типов. Списки и строки, а также другие типы, являющиеся упорядоченными наборами, называются последовательностями.

8.2. Списочные значения¶

Есть несколько способов создать новый список, простейший из них — заключить элементы в квадратные скобки, [ и ]:

[10, 20, 30, 40]
["spam", "bungee", "swallow"]

В первом примере у нас список из четырех целых чисел. Во втором — список из трех строк. Элементы списка не обязательно относятся к одному типу. Следующий список содержит строку, число с плавающей точкой, целое число и… еще один список:

["hello", 2.0, 5, [10, 20]]

Список внутри другого списка называют вложенным.

Наконец, список может вовсе не содержать элементов. Такой список называют пустым и обозначают [].

В логическом выражении пустой список, так же, как 0 или пустая строка, считается ложью:

>>> if []:
...    print 'This is true."... 
else:
...    print 'This is false."...

This is false.
>>>

Мы можем присваивать списочные значения переменным и передавать списки в качестве аргументов при вызове функций:

>>> vocabulary = ["ameliorate", "castigate", "defenestrate"]
>>> numbers = [17, 123]
>>> empty = []
>>> print vocabulary, numbers, empty
['ameliorate', 'castigate', 'defenestrate'] [17, 123] []

8.3. Доступ к элементам¶

Для доступа к элементам списка используется тот же оператор [], что и для доступа к символам строки. Выражение в квадратных скобках задает индекс. Не забывайте, что индексы начинаются с 0:

В качестве индекса можно использовать любое целочисленное выражение:

>>> numbers[9-8]
5
>>> numbers[1.0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers

Если попытаться получить доступ к несуществующему элементу, то получим ошибку выполнения:

>>> numbers[2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

Если индекс отрицательный, то счет идет от конца списка:

>>> numbers[-1]
5
>>> numbers[-2]
17
>>> numbers[-3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

Выражение numbers[-1] дает последний элемент списка, numbers[-2] — второй от конца, а элемента numbers[-3] не существует.

Часто в качестве индекса используется переменная цикла.

horsemen = ["war", "famine", "pestilence", "death"]

i = 0
while i < 4:
    print horsemen[i]
    i += 1

Этот цикл while считает от 0 до 4. Когда переменная цикла i становится равна 4, условие становится ложным и цикл завершается. Таким образом, тело цикла выполняется для i со значениями 0, 1, 2 и 3.

В каждой итерации переменная i используется как индекс для списка, чтобы вывести i-тый элемент. Этот прием называется обход списка.

8.4. Длина списка¶

Функция len возвращает длину списка, то есть, количество элементов в списке. В качестве верхней границы в цикле удобно использовать возвращаемое этой функцией значение, а не константу. При этом, если размер списка изменится, вам не придется просматривать программу и вносить изменения во все циклы, работающие с этим списком; они будут работать корректно со списком любого размера:

horsemen = ["war", "famine", "pestilence", "death"]

i = 0
num = len(horsemen)
while i < num:
    print horsemen[i]
    i += 1

В последней итерации i равно len(horsemen) 1, то есть, индексу последнего элемента списка. Когда i становится равным len(horsemen), условие цикла становится ложным и тело цикла не выполняется. И это правильно, поскольку len(horsemen) недопустимый для данного списка индекс.

Хотя список может содержать другой список, вложенный список считается одним элементом. Длина этого списка равна 4:

['spam!', 1, ['Brie', 'Roquefort', 'Pol le Veq'], [1, 2, 3]]

8.5. Проверка вхождения в список¶

Оператор in проверяет вхождение элемента в последовательность и дает в результате логическое значение. Мы уже использовали его со строками, но он также работает со списками и другими последовательностями:

>>> horsemen = ['war', 'famine', 'pestilence', 'death']
>>> 'pestilence' in horsemen
True
>>> 'debauchery' in horsemen
False

Поскольку ‘pestilence’ входит в список horsemen, то оператор in возвращает True. Поскольку ‘debauchery’ не входит в список, in возвращает False.

Используя not вместе с in, можно проверить, что элемент не является элементом списка:

>>> 'debauchery' not in horsemen
True

8.6. Операции над списками¶

Оператор + конкатенирует списки:

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = a + b
>>> print c
[1, 2, 3, 4, 5, 6]

Оператор * повторяет элементы списка заданное число раз:

>>> [0] * 4
[0, 0, 0, 0]
>>> [1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]

В первом примере 0 повторяется четыре раза. Во втором три раза повторяются элементы 1, 2, 3.

8.7. Срезы списков¶

Мы выполняли срезы строк, но срезы также работают для списков:

>>> a_list = ['a', 'b', 'c', 'd', 'e', 'f']
>>> a_list[1:3]
['b', 'c']
>>> a_list[:4]
['a', 'b', 'c', 'd']
>>> a_list[3:]
['d', 'e', 'f']
>>> a_list[:]
['a', 'b', 'c', 'd', 'e', 'f']

8.8. Функция range

В программировании часто требуются списки последовательных целых чисел, и Python предоставляет простой способ для их создания:

>>> range(1, 5)
[1, 2, 3, 4]

Функция range принимает два аргумента и возвращает список целых, начиная от числа, заданного первым аргументом, и до числа, заданного вторым аргументом, не включая последнее.

Можно вызывать range и по-другому. При вызове с единственным аргументом функция возвращает список, начинающийся с 0:

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Третий аргумент, если он указан, задает шаг между соседними значениями в списке. Получим список чисел от 1 до 10 с шагом 2:

>>> range(1, 10, 2)
[1, 3, 5, 7, 9]

Если шаг задан отрицательным числом, то начальное число должно быть больше конечного:

>>> range(20, 4, -5)
[20, 15, 10, 5]

Иначе результатом будет пустой список:

8.9. Списки изменяемы¶

В отличие от строк, списки изменяемы. Это означает, мы можем изменять их элементы. Используя оператор [] в левой части присваивания, можно избирательно обновить один из элементов:

>>> fruit = ["banana", "apple", "quince"]
>>> fruit[0] = "pear"
>>> fruit[-1] = "orange"
>>> print fruit
['pear', 'apple', 'orange']

Оператор [] может использоваться со списком в любом месте выражения. Если он появляется слева от оператора присваивания, он изменяет элемент списка. В приведенном примере первый элемент списка fruit изменяется с ‘banana’ на ‘pear’, а последний — с ‘quince’ на ‘orange’. Присваивание отдельному элементу не работает для строк:

>>> my_string = 'TEST'
>>> my_string[2] = 'X'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

Но работает для списков:

>>> my_list = ['T', 'E', 'S', 'T']
>>> my_list[2] = 'X'
>>> my_list
['T', 'E', 'X', 'T']

Используя срез, можно изменить несколько элементов сразу:

>>> a_list = ['a', 'b', 'c', 'd', 'e', 'f']
>>> a_list[1:3] = ['x', 'y']
>>> print a_list
['a', 'x', 'y', 'd', 'e', 'f']

Можно также удалить элементы из списка, присвоив им пустой список:

>>> a_list = ['a', 'b', 'c', 'd', 'e', 'f']
>>> a_list[1:3] = []
>>> print a_list
['a', 'd', 'e', 'f']

А можно добавить элементы в список, втиснув их в пустой срез в нужном месте:

>>> a_list = ['a', 'd', 'f']
>>> a_list[1:1] = ['b', 'c']
>>> print a_list
['a', 'b', 'c', 'd', 'f']
>>> a_list[4:4] = ['e']
>>> print a_list
['a', 'b', 'c', 'd', 'e', 'f']

8.10. Удаление списка¶

Удаление элементов с помощью присваивания срезов довольно вычурно, и потому чревато ошибками. Python предлагает альтернативный способ, более легкий для чтения и понимания, и, к тому же, более универсальный.

del удаляет элемент из списка:

>>> a = ['one', 'two', 'three']
>>> del a[1]
>>> a
['one', 'three']

Как и следовало ожидать, del работает с отрицательными индексами, и генерирует ошибку выполнения, если заданный индекс выходит за границы разрешенного диапазона.

С del можно использовать срез:

>>> a_list = ['a', 'b', 'c', 'd', 'e', 'f']
>>> del a_list[1:5]
>>> print a_list
['a', 'f']

8.11. Объекты и значения¶

Выполним предложения присваивания:

a = "banana"
b = "banana"

Теперь мы знаем, что и a и b указывают на строку «banana». Но мы не можем сказать, указывают ли они на одну и ту же строку.

Есть два варианта:

Иллюстрация a и b

В первом случае a и b указывают на два разных объекта с одинаковыми значениями. Во втором случае они ссылаются на один и тот же объект. Объект — это что-то, с чем может быть связано имя переменной.

У каждого объекта имеется уникальный идентификатор, который можно получить с помощью функции id. Отобразив идентификаторы объектов, на которые указывают a и b, мы узнаем, связаны ли эти переменные с одним и тем же объектом:

>>> id(a)
135044008
>>> id(b)
135044008

Мы два раза получили один и тот же идентификатор, а это значит, что Python создал только одну строку, и обе переменные, a и b, связаны с ней. Вы, вероятно, получите другое значение идентификатора.

Интересно, что списки ведут себя иначе. Если создать два списка, то мы получим два объекта:

>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> id(a)
135045528
>>> id(b)
135041704

На диаграмме это выглядит так:

Иллюстрация списков

Переменные a и b ссылаются на разные объекты, имеющие одинаковые значения.

8.12. Альтернативные имена¶

Поскольку переменные ссылаются на объекты, то, если мы присвоим одну переменную другой, обе переменные будут ссылаться на один и тот же объект:

>>> a = [1, 2, 3]
>>> b = a
>>> id(a) == id(b)
True

На диаграмме это выглядит так:

Иллюстрация списков

Поскольку два разных имени, a и b, связаны с одним и тем же списком, будем называть их альтернативными именами. Изменения, сделанные с использованием одного имени, оказывают влияние и на другое:

>>> b[0] = 5
>>> print a
[5, 2, 3]

Хотя такое поведение может быть полезным, иногда оно оказывается нежелательным. Вообще говоря, лучше избегать альтернативных имен, работая с изменяемыми объектами. А вот для неизменяемых объектов альтернативные имена не представляют никаких проблем. Поэтому Python создает альтернативные имена для строк, когда представляется случай сэкономить память компьютера.

8.13. Клонирование списков¶

Если нужно изменить список и при этом сохранить копию оригинального списка, то понадобится сделать копию самого списка, а не ссылки на него. Этот процесс иногда называют клонированием.

Простейший способ клонировать список — воспользоваться оператором среза:

>>> a = [1, 2, 3]
>>> b = a[:]
>>> print b
[1, 2, 3]

Получение любого среза списка a приводит к созданию нового списка. В данном случае срез включает весь список.

Теперь можно изменять список b, не беспокоясь об a:

>>> b[0] = 5
>>> print a
[1, 2, 3]

8.14. Списки и циклы for

Цикл for также работает со списками. Синтаксис такой:

for <переменная> in <список>:
    <тело>

Это предложение эквивалентно следующему фрагменту кода:

i = 0
while i < len(<список>):
    <переменная> = <список>[i]
    <тело>
    i += 1

Цикл for более лаконичен, поскольку мы можем обойтись без переменной цикла i. Вот рассмотренный выше цикл, переписанный с помощью for.

for horseman in horsemen:
    print horseman

Он читается почти по-английски: для (каждого) horseman (англ.: всадник) в (списке) horsemen (англ.: всадники) напечатать horseman.

Любое списочное выражение может быть использовано в цикле for:

for number in range(20):
    if number % 3 == 0:
        print  number

for fruit in ["banana", "apple", "quince"]:
    print "I like to eat " + fruit + "s!"

В первом примере выводятся все числа, кратные 3, между 0 и 19. Во втором примере выражается энтузиазм по поводу разных видов фруктов.

Поскольку списки изменяемы, часто выполняется обход списка с изменением каждого из его элементов. Следующий пример возводит в квадрат все числа в списке от 1 до 5:

numbers = [1, 2, 3, 4, 5]

for index in range(len(numbers)):
    numbers[index] = numbers[index]**2

Подумайте над выражением range(len(numbers)) и разберитесь, как оно работает. В данном случае нам нужно как значение, так и индекс элемента списка для того, чтобы мы могли присвоить ему новое значение.

Такой прием довольно распространен в программировании, поэтому Python предлагает более красивый способ реализовать его:

numbers = [1, 2, 3, 4, 5]

for index, value in enumerate(numbers):
    numbers[index] = value**2

Здесь функция enumerate в каждой итерации возвращает очередной индекс и связанное с ним значение. Еще один пример того, как работает enumerate:

>>> for index, value in enumerate(['banana', 'apple', 'pear', 'quince']):
...    print index, value
...
0 banana
1 apple
2 pear
3 quince
>>>

8.15. Списочные параметры¶

При передаче списка в качестве аргумента передается ссылка на список, а не его копия. А поскольку списки изменяемы, то изменение параметра внутри функции означает также и изменение аргумента. Например, функция ниже принимает список в качестве аргумента и умножает каждый элемент списка на 2:

def double_stuff(a_list):
    for index, value in enumerate(a_list):
        a_list[index] = 2 * value

Если поместить функцию double_stuff в файл ch08.py, то сможем так протестировать ее:

>>> from ch08 import double_stuff
>>> things = [2, 5, 'Spam', 9.5]
>>> double_stuff(things)
>>> things
[4, 10, 'SpamSpam', 19.0]
>>>

Параметр a_list и переменная things являются альтернативными именами одного и того же объекта.

Если функция модифицирует списочный параметр, изменения будут видны в вызывающем коде.

8.16. Чистые и модифицирующие функции¶

Функции, которые принимают списки как аргументы и изменяют эти списки в ходе выполнения, называются модифицирующими, а изменения, которые они делают, называются побочным эффектом.

Чистая функция не производит побочных эффектов. Все ее связи с вызывающей программой сводятся к параметрам, которых она не изменяет, и возвращаемому значению. Вот чистая функция double_stuff:

def double_stuff(a_list):
    new_list = []
    for value in a_list:
        new_list += [2 * value]
    return new_list

Эта версия double_stuff не изменяет своих аргументов:

>>> from ch08 import double_stuff
>>> things = [2, 5, 'Spam', 9.5]
>>> double_stuff(things)
[4, 10, 'SpamSpam', 19.0]
>>> things
[2, 5, 'Spam', 9.5]
>>>

При использовании чистой функции double_stuff, для изменения things вам понадобится присвоить возвращаемое значение things:

>>> things = double_stuff(things)
>>> things
[4, 10, 'SpamSpam', 19.0]
>>>

8.17. Какая функция лучше?¶

Все, что можно сделать с помощью модифицирующих функций, может быть сделано и при помощи чистых функций. На самом деле, некоторые языки программирования поддерживают только чистые функции. Есть мнение, что программы, использующие только чистые функции, быстрее разрабатывать и в них закрадывается меньше ошибок. И все же, иногда модифицирующие функции удобны, а в отдельных случаях программы с чистыми функциями менее эффективны.

Вообще, мы рекомендуем писать чистые функции всегда, когда это разумно, и прибегать к модифицирующим только в случаях, когда их использование дает несомненное преимущество.

8.18. Вложенные списки¶

Вложенный список — это список, являющийся элементом другого списка. В следующем списке элемент с индексом 3 есть вложенный список:

>>> nested = ["hello", 2.0, 5, [10, 20]]

Если ввести nested[3], то получим [10, 20]. Извлечь элемент из вложенного списка можно за два шага:

>>> elem = nested[3]
>>> elem[0]
10

А можно объединить эти два шага в выражение:

Оператор квадратная скобка вычисляется слева направо, так что это выражение берет 3-й элемент списка nested и извлекает из него 1-ый элемент.

8.19. Матрицы¶

Вложенные списки часто используют для того, чтобы представлять матрицы. Например, матрицу

Матрица

можно представить так:

>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

matrix есть список из трех элементов, в котором каждый элемент задает строку матрицы. Можно получить целую строку матрицы, как обычно:

Также можно извлечь отдельный элемент матрицы, используя два индекса:

Первый индекс выбирает строку, а второй — столбец. Хотя этот способ представления матриц самый распространенный, он не является единственным. Его вариацией является список столбцов вместо списка строк. Позднее мы увидим более радикальную альтернативу, использующую словарь.

8.20. Разработка через тестирование¶

Разработка через тестирование (англ.: Test-driven development, TDD) — это практика разработки программ, в которой программа создается серией небольших итераций, в каждой из которых сначала пишутся автоматические тесты, а затем код, реализующий тестируемую функциональность. От итерации к итерации растет реализованная и оттестированная функциональность.

Продемонстрируем разработку через тестирование с помощью доктестов. Скажем, нам нужна функция, которая создает матрицу с rows строк и columns столбцов, принимая аргументы для rows и columns.

Сначала подготовим тест для этой функции в файле matrices.py:

def make_matrix(rows, columns):
    """
      >>> make_matrix(3, 5)
      [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
    """


if __name__ == '__main__':
    import doctest
    doctest.testmod()

Выполнив скрипт, видим, что тест не прошел:

**********************************************************************
File "matrices.py", line 3, in __main__.make_matrix
Failed example:
    make_matrix(3, 5)
Expected:
    [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
Got nothing
**********************************************************************
1 items had failures:
   1 of   1 in __main__.make_matrix
***Test Failed*** 1 failures.

Тест не проходит, поскольку тело функции не содержит ничего, кроме строки в тройных кавычках, и поэтому возвращает None. Наш тест требует, чтобы функция возвращала матрицу 3 x 5, заполненную нулями.

Правила разработки через тестирование говорят, что для начала нужно написать самый простой вариант, который бы удовлетворял тест. Так что, в этом случае, просто вернем ожидаемый результат:

def make_matrix(rows, columns):
    """
      >>> make_matrix(3, 5)
      [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
    """
    return [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

Теперь при выполнении скрипта тест успешно проходит, но наша реализация make_matrix всегда возвращает один и тот же результат, а это явно не то, что имелось в виду. В качестве мотивации дальнейших улучшений добавим тест:

def make_matrix(rows, columns):
    """
      >>> make_matrix(3, 5)
      [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
      >>> make_matrix(4, 2)
      [[0, 0], [0, 0], [0, 0], [0, 0]]
    """
    return [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

Как и следовало ожидать, тест не проходит:

**********************************************************************
File "matrices.py", line 5, in __main__.make_matrix
Failed example:
    make_matrix(4, 2)
Expected:
    [[0, 0], [0, 0], [0, 0], [0, 0]]
Got:
    [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
**********************************************************************
1 items had failures:
   1 of   2 in __main__.make_matrix
***Test Failed*** 1 failures.

Этот процесс называется разработкой через тестирование, потому что код пишется только тогда, когда имеется тест, который не проходит. Мотивированные последним тестом, теперь напишем более общее решение:

def make_matrix(rows, columns):
    """
      >>> make_matrix(3, 5)
      [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
      >>> make_matrix(4, 2)
      [[0, 0], [0, 0], [0, 0], [0, 0]]
    """
    return [[0] * columns] * rows

Это решение, похоже, работает, поскольку тесты проходят. Однако, начав пользоваться новой функцией, быстро обнаружим баг:

>>> from matrices import *
>>> m = make_matrix(4, 3)
>>> m
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> m[1][2] = 7
>>> m
[[0, 0, 7], [0, 0, 7], [0, 0, 7], [0, 0, 7]]
>>>

Мы хотели присвоить значение 7 элементу во второй строке и третьем столбце, но, вместо этого, значение 7 получили все элементы третьего столбца!

По размышлении становится ясно, что в нашем текущем решении каждая строка матрицы — всего лишь ссылка на один и тот же список. Это определенно не то, что нам нужно. Приступая к исправлению бага, сначала напишем тест, демонстрирующий наличие этого бага:

def make_matrix(rows, columns):
    """
      >>> make_matrix(3, 5)
      [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
      >>> make_matrix(4, 2)
      [[0, 0], [0, 0], [0, 0], [0, 0]]
      >>> m = make_matrix(4, 2)
      >>> m[1][1] = 7
      >>> m
      [[0, 0], [0, 7], [0, 0], [0, 0]]
    """
    return [[0] * columns] * rows

Теперь, имея тест, который демонстрирует баг в программе, мы должны найти лучшее решение:

def make_matrix(rows, columns):
    """
      >>> make_matrix(3, 5)
      [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
      >>> make_matrix(4, 2)
      [[0, 0], [0, 0], [0, 0], [0, 0]]
      >>> m = make_matrix(4, 2)
      >>> m[1][1] = 7
      >>> m
      [[0, 0], [0, 7], [0, 0], [0, 0]]
    """
    matrix = []
    for row in range(rows):
        matrix += [[0] * columns]
    return matrix

Процесс разработки через тестирование имеет ряд преимуществ. Этот процесс:

  • заставляет конкретно думать о задаче, которую нужно решить, прежде чем
    пытаться ее решить,
  • поощряет разбивать сложные задачи на более мелкие и простые, и пошагово
    приближаться к решению задачи в целом,
  • дает набор автоматических тестов для программы, облегчая внесение в нее
    изменений и дополнений в дальнейшем.

8.21. Строки и списки¶

В Python есть функция list, которая принимает значение некоторой последовательности как аргумент и создает список из ее элементов.

>>> list("Crunchy Frog")
['C', 'r', 'u', 'n', 'c', 'h', 'y', ' ', 'F', 'r', 'o', 'g']

Также существует функция str, которая берет любое значение Python как аргумент и возвращает его строковое представление.

>>> str(5)
'5'
>>> str(None)
'None'
>>> str(list("nope"))
"['n', 'o', 'p', 'e']"

Как видно из последнего примера, с помощью str не удается соединить вместе элементы списка символов. Это можно сделать с помощью функции join из модуля string:

>>> import string
>>> char_list = list("Frog")
>>> char_list
['F', 'r', 'o', 'g']
>>> string.join(char_list, '')
'Frog'

Две очень полезные функции модуля string имеют дело со списками строк. Функция split разбивает строку на слова, возвращая список слов. По умолчанию считается, что слова отделяются друг от друга одним или более пробельными символами:

>>> import string
>>> song = "The rain in Spain..."
>>> string.split(song)
['The', 'rain', 'in', 'Spain...']

Необязательный аргумент позволяет указать, какие символы считать разделителями слов. В следующем примере в качестве разделителя указана последовательность двух символов ai:

>>> string.split(song, 'ai')
['The r', 'n in Sp', 'n...']

Заметьте, что ai не попадает в список.

Функция string.join делает обратное функции string.split. Она принимает два аргумента: список строк и разделитель, который будет разделять элементы списка в результирующей строке.

>>> import string
>>> words = ['crunchy', 'raw', 'unboned', 'real', 'dead', 'frog']
>>> string.join(words, ' ')
'crunchy raw unboned real dead frog'
>>> string.join(words, '**')
'crunchy**raw**unboned**real**dead**frog'

8.22. Глоссарий¶

альтернативные имена
Имена нескольких переменных, ссылающиеся на один и тот же объект.
вложенный список
Список, являющийся элементом другого списка.
изменяемый тип данных
Тип данных, элементы которого могут быть изменены. Все изменяемые типы
являются составными типами. Список является изменяемым типом данных;
строка — неизменяемым.
индекс
Целочисленное выражение, указывающее на элемент последовательности (например,
строки или списка).
клонирование
Создание нового объекта, имеющего то же значение, что и существующий.
В отличие от клонирования, присваивание одной переменной другой создает
альтернативное имя, а не копию объекта.
модифицирующая функция
Функция, которая изменяет свои параметры. Только изменяемые типы могут
изменяться модифицирующей функцией.
обход списка
Последовательная работа с каждым элементом списка.
объект
Нечто, с чем может быть связано имя переменной.
побочный эффект
Изменение в состоянии программы, сделанное вызванной функцией, иное,
чем возврат функцией значения. Побочные эффекты производят только
модифицирующие функции.
последовательность
Тип данных, представляющий собой упорядоченный набор элементов, каждый
из которых выбирается по индексу.
разработка через тестирование
Техника программирования, при которой автоматические модульные тесты
для программы пишутся раньше самой программы и,
по существу, управляют её разработкой. (см. статью в Википедии
Разработка через тестирование.)
список
Именованный набор элементов, в котором каждый элемент выбирается по
индексу.
чистая функция
Функция без побочных эффектов. Чистая функция влияет на вызывающий код
только через возвращаемое значение.
шаг последовательности
Интервал между значениями элементов линейной последовательности. Третий
(необязательный) аргумент функции range; если не указан, то по
умолчанию получает значение 1.
элемент
Одно из значений в списке (или другой последовательности). Оператор
[] выбирает элемент списка.

8.23. Упражнения¶

  1. Напишите цикл, который обходит список

    ['spam!', 1, ['Brie', 'Roquefort', 'Pol le Veq'], [1, 2, 3]]
    

    и выводит длину каждого элемента. Что происходит, когда вы передаете целое
    число функции len? Замените 1 на ‘one’ и выполните вашу
    программу снова.

  2. Создайте файл ch08e02.py следующего содержания:

    #  Add your doctests here:
    """
    """
    
    # Write your Python code here:
    
    if __name__ == '__main__':
        import doctest
        doctest.testmod()
    

    Добавляйте следующие наборы доктестов в докстроку в начале файла и пишите
    код Python, который обеспечит прохождение доктестов. Добавляйте по одному
    набору доктестов за один раз.

    """
       >>> a_list[3]
       42
       >>> a_list[6]
       'Ni!'
       >>> len(a_list)
       8
    """
    
    """
       >>> b_list[1:]
       ['Stills', 'Nash']
       >>> group = b_list + c_list
       >>> group[-1]
       'Young'
    """
    
    """
       >>> 'war' in mystery_list
       False
       >>> 'peace' in mystery_list
       True
       >>> 'justice' in mystery_list
       True
       >>> 'oppression' in mystery_list
       False
       >>> 'equality' in mystery_list
       True
    """
    
    """
       >>> range(a, b, c)
       [5, 9, 13, 17]
    """
    

    Не добавляйте новый набор доктестов до тех пор, пока все предыдущие
    не будут проходить успешно.

  3. Что скажет интерпретатор Python на следующее предложение?

    Три аргумента функции range — это start, stop и step,
    соответственно. В этом примере start больше, чем stop. А что
    произойдет, если start < stop и step < 0? Сформулируйте
    правило о том, как соотносятся start, stop и step.

  4. a = [1, 2, 3]
    b = a[:]
    b[0] = 5
    

    Нарисуйте диаграмму для a и b до и после выполнения
    третьей строки.

  5. Что выведет следующая программа?

    this = ['I', 'am', 'not', 'a', 'crook']
    that = ['I', 'am', 'not', 'a', 'crook']
    print "Test 1: %s" % (id(this) == id(that))
    that = this
    print "Test 2: %s" % (id(this) == id(that))
    

    Подробно объясните результаты.

  6. Создайте файл ch08e06.py и, следуя процедуре, описанной в упражнении 2,
    добейтесь прохождения следующих доктестов:

    """
       >>> 13 in junk
       True
       >>> del junk[4]
       >>> junk
       [3, 7, 9, 10, 17, 21, 24, 27]
       >>> del junk[a:b]
       >>> junk
       [3, 7, 27]
    """
    
    """
       >>> nlist[2][1]
       0
       >>> nlist[0][2]
       17
       >>> nlist[1][1]
       5
    """
    
    """
       >>> import string
       >>> string.split(message, '??')
       ['this', 'and', 'that']
    """
    
  7. Напишите функцию add_lists(a, b), которая берет два списка чисел
    одинаковой длины и возвращает новый список с суммами соответствующих
    элементов этих списков.

    def add_lists(a, b):
        """
          >>> add_lists([1, 1], [1, 1])
          [2, 2]
          >>> add_lists([1, 2], [1, 4])
          [2, 6]
          >>> add_lists([1, 2, 1], [1, 4, 3])
          [2, 6, 4]
        """
    

    Приведенные тесты для add_lists должны успешно пройти.

  8. Напишите функцию mult_lists(a, b), которая берет два списка чисел
    одинаковой длины и возвращает сумму произведений соответствующих элементов
    этих списков.

    def mult_lists(a, b):
        """
          >>> mult_lists([1, 1], [1, 1])
          2
          >>> mult_lists([1, 2], [1, 4])
          9
          >>> mult_lists([1, 2, 1], [1, 4, 3])
          12
        """
    

    Убедитесь, что приведенные доктесты для mult_lists проходит успешно.

  9. Добавьте следующие две функции в файл matrices.py, созданный в разделе
    о разработке через тестирование:

    def add_row(matrix):
        """
          >>> m = [[0, 0], [0, 0]]
          >>> add_row(m)
          [[0, 0], [0, 0], [0, 0]]
          >>> n = [[3, 2, 5], [1, 4, 7]]
          >>> add_row(n)
          [[3, 2, 5], [1, 4, 7], [0, 0, 0]]
          >>> n
          [[3, 2, 5], [1, 4, 7]]
        """
    
    def add_column(matrix):
        """
          >>> m = [[0, 0], [0, 0]]
          >>> add_column(m)
          [[0, 0, 0], [0, 0, 0]]
          >>> n = [[3, 2], [5, 1], [4, 7]]
          >>> add_column(n)
          [[3, 2, 0], [5, 1, 0], [4, 7, 0]]
          >>> n
          [[3, 2], [5, 1], [4, 7]]
        """
    

    Ваши новые функции должны пройти доктесты. Заметьте, что последний из
    доктестов для каждой функции проверяет, что add_row и add_column
    являются чистыми функциями.

    Подсказка:* в Python имеется модуль copy
    с функцией deepcopy, которая может облегчить вам задачу. Мы подробнее
    поговорим о deepcopy позднее, но, если хотите попробовать эту функцию
    сейчас, погуглите python copy module.

  10. Напишите функцию add_matrices(m1, m2), которая складывает m1 и m2
    и возвращает новую матрицу, содержащую их сумму. Мы сделаем допущение, что
    m1 и m2 одинакового размера, и будем складывать матрицы, складывая
    соответствующие их значения.

    def add_matrices(m1, m2):
        """
          >>> a = [[1, 2], [3, 4]]
          >>> b = [[2, 2], [2, 2]]
          >>> add_matrices(a, b)
          [[3, 4], [5, 6]]
          >>> c = [[8, 2], [3, 4], [5, 7]]
          >>> d = [[3, 2], [9, 2], [10, 12]]
          >>> add_matrices(c, d)
          [[11, 4], [12, 6], [15, 19]]
          >>> c
          [[8, 2], [3, 4], [5, 7]]
          >>> d
          [[3, 2], [9, 2], [10, 12]]
       """
    

    Добавьте эту новую функцию в matrices.py и убедитесь, что она проходит
    приведенные выше тесты. Два последних доктеста проверяют, что
    add_matrices является чистой функцией.

  11. Напишите функцию scalar_mult(n, m), которая умножает матрицу m
    на число n. Убедитесь, что ваша функция проходит приведенные доктесты:

    def scalar_mult(n, m):
        """
          >>> a = [[1, 2], [3, 4]]
          >>> scalar_mult(3, a)
          [[3, 6], [9, 12]]
          >>> b = [[3, 5, 7], [1, 1, 1], [0, 2, 0], [2, 2, 3]]
          >>> scalar_mult(10, b)
          [[30, 50, 70], [10, 10, 10], [0, 20, 0], [20, 20, 30]]
          >>> b
          [[3, 5, 7], [1, 1, 1], [0, 2, 0], [2, 2, 3]]
        """
    
  12. Добавьте новые функции в matrices.py, удовлетворяющие приведенным доктестам:

    def row_times_column(m1, row, m2, column):
        """
          >>> row_times_column([[1, 2], [3, 4]], 0, [[5, 6], [7, 8]], 0)
          19
          >>> row_times_column([[1, 2], [3, 4]], 0, [[5, 6], [7, 8]], 1)
          22
          >>> row_times_column([[1, 2], [3, 4]], 1, [[5, 6], [7, 8]], 0)
          43
          >>> row_times_column([[1, 2], [3, 4]], 1, [[5, 6], [7, 8]], 1)
          50
        """
    
    def matrix_mult(m1, m2):
       """
          >>> matrix_mult([[1, 2], [3,  4]], [[5, 6], [7, 8]])
          [[19, 22], [43, 50]]
          >>> matrix_mult([[1, 2, 3], [4,  5, 6]], [[7, 8], [9, 1], [2, 3]])
          [[31, 19], [85, 55]]
          >>> matrix_mult([[7, 8], [9, 1], [2, 3]], [[1, 2, 3], [4, 5, 6]])
          [[39, 54, 69], [13, 23, 33], [14, 19, 24]]
        """
    
  13. В режиме интерпретатора Python введите:

    >>> import string
    >>> song = "The rain in Spain..."
    >>> string.join(string.split(song))
    

    Опишите, как соотносятся string.join(string.split(song)) и song.
    Верно ли это соотношение для любых строк? В каком случае строки получатся
    разные?

  14. Напишите функцию replace(s, old, new), которая заменяет все вхождения
    old на new в строке s.

    def replace(s, old, new):
        """
          >>> replace('Mississippi', 'i', 'I')
          'MIssIssIppI'
          >>> s = 'I love spom!  Spom is my favorite food.  Spom, spom, spom, yum!'
          >>> replace(s, 'om', 'am')
          'I love spam!  Spam is my favorite food.  Spam, spam, spam, yum!'
          >>> replace(s, 'o', 'a')
          'I lave spam!  Spam is my favarite faad.  Spam, spam, spam, yum!'
        """
    

    Ваша программа должна удовлетворять приведенным доктестам. Подсказка:
    воспользуйтесь string.split и string.join.

Содержание:развернуть

  • Что такое список
  • Как списки хранятся в памяти?

  • Базовая работа со списками
  • Объявление списка

  • Обращение к элементу списка в Python

  • Добавление в список

  • Добавление в список на указанную позицию

  • Изменение элементов списка

  • Удаление элемента из списка

  • Как проверить наличие элемента в списке

  • Объединение списков

  • Копирование списка Python

  • Цикл по списку

  • Методы списков
  • Вложенные списки
  • Срезы
  • Генераторы списков
  • Best Practices
  • Как получить список в обратном порядке

  • Как перевести список в другой формат?

  • Как узнать индекс элемента в списке?

  • Как посчитать количество уникальных элементов в списке?

  • Как проверить список на пустоту?

  • Как создать список числовых элементов с шагом

Создание списка в Python может понадобиться для хранения в них коллекции объектов. Списки могут хранить объекты всех типов в одном, в отличие от массива в другом языке программирования. Также размер списка доступен к изменению.

Ниже разберёмся, как устроены списки, как с ними работать и приведём 6 примеров из практики.

Что такое список

Список (list) — тип данных, предназначенный для хранения набора или последовательности разных элементов.

[1, 33, 6, 9] # литерал списка в Python

Его можно сравнить со списком покупок для магазина: точно так же вносятся элементы, их тоже можно добавлять и корректировать.

Как списки хранятся в памяти?

Базовая C-структура списков в Python (CPython) выглядит следующим образом:

typedef struct {
PyObject_VAR_HEAD
PyObject **ob_item;
Py_ssize_t allocated;
} PyListObject;

Когда мы создаём список, в памяти под него резервируется объект, состоящий из 3-х частей:

  • PyObject_VAR_HEAD — заголовок;
  • ob_item — массив указателей на элементы списка;
  • allocated — количество выделенной памяти под элементы списка.

Объект списка хранит указатели на объекты, а не на сами объекты

Python размещает элементы списка в памяти, затем размещает указатели на эти элементы. Таким образом, список в Python — это массив указателей.

Список в Python — это массив указателей на элементы, размещенные в памяти

Базовая работа со списками

Объявление списка

Объявление списка — самый первый и главный этап его создания. Для объявления списка в Python существует несколько способов.

Вариант №1: Через литерал (выражение, создающее объект):

>>> elements = [1, 3, 5, 6]

>>> type(elements)
<class 'list'>

>>> print(elements)
[1, 3, 5, 6]

В данном примере мы создали список с заранее известными данными. Если нужен пустой список, в квадратных скобках ничего не указывается — elements = [].

Вариант №2: Через функцию list():

>>> elements = list()

>>> type(elements)
<class 'list'>

>>> print(elements)
[]

В этом примере создается пустой список.

Обращение к элементу списка в Python

Чтобы обратиться к элементу списка, достаточно указать его индекс:

>>> elements = [1, 2, 3, 'word']

>>> elements[3]
'word'

Индекс — это порядковый номер элемента в списке. В примере выше индексы (позиции в списке) соответственно будут: 0, 1, 2, 3.

Нумерация элементов списка в Python начинается с нуля

Существует также отрицательный индекс, рассмотрим на примере:

>>> elements = [1, 2, 3, 'word']

>>> elements[-4]
1

>>> elements[-1]
'word'

Отрицательные индексы работают справа налево (то есть индекс значения ‘1’ — -4, а отрицательный индекс ‘word’ — -1.

💡 Отрицательным индексом удобно пользоваться, когда необходимо обратиться к последнему элементу в списке, не высчитывая его номер. Любой конечный элемент будет с индексом, равным -1.

Добавление в список

В списках доступно добавление, изменение, удаление элементов. Рассмотрим каждый способ изменения элементов на примерах.

Для того чтобы добавить новый элемент в список, используется list.append(x), где list — список, x — нужное значение.

>>> elements = [1, 2, 3, 'word']
>>> elements.append('meow')

>>> print(elements)
[1, 2, 3, 'word', 'meow']

Для простого примера, рассмотрим создание списка с нуля с помощью метода append() :

>>> elements = []
>>> elements.append(1)
>>> elements.append('word')
>>> elements.append('meow')

>>> print(elements)
[1, 'word', 'meow']

Добавление в список на указанную позицию

Немаловажно обратить внимание на метод list.insert(i, x), где list — список, i — позиция, x — нужное значение.

>>> elements = [1, 2, 4]
>>> print(elements)
[1, 2, 4]

>>> elements.insert(2, 3)
>>> print(elements)
[1, 2, 3, 4]

Изменение элементов списка

Изменение элементов списка происходит следующим образом: нужно выбрать элемент по индексу (порядковому номеру элемента) и присвоить новое значение.

>>> elements = [2, 4, 6]
>>> elements[2] = 8

>>> print(elements)
[2, 4, 8]

В примере выше мы заменили 6 на 8.

Не забывайте, что счёт начинается с нуля, и в данном списке цифра 6 это 2-й элемент

Удаление элемента из списка

Для удаление из списка используют инструкцию del list[i], где list — список, i — индекс (позиция) элемента в списке:

>>> elements = [1, "test", 5, 7]
>>> del elements[1]
>>> print(elements)
[1, 5, 7]

Удалять можно как из текущего списка, так и из вложенных списков:

>>> my_list = ["hello", "world", "!"]
>>> elements = [1, my_list, "ok"]
>>> del elements[1][2]

>>> print(elements)
[1, ['hello', 'world'], 'ok']

Можно удалять целыми диапазонами:

>>> elements = [2, 4, 6, 8, 12]
>>> del elements[2:] # удаляем все элементы после 2-го элемента (включительно)
>>> print(elements)
[2, 4]

>>> elements = [2, 4, 6, 8, 12]
>>> del elements[:3] # удаляем все элементы до 3-го элемента
>>> print(elements)
[8, 12]

>>> elements = [2, 4, 6, 8, 12]
>>> del elements[1:3] # удаляем от 1-го элемента включительно до 3-го элемента
>>> print(elements)
[2, 8, 12]

Еще один способ удаления из списка — list.remove(x), где list — список, x — значение, которое нужно удалить:

>>> elements = [2, "test", 4]
>>> elements.remove("test")
>>> print(elements)
[2, 4]

Как проверить наличие элемента в списке

Для того чтобы проверить существование какого-либо элемента в списке, нужно воспользоваться оператором in. Рассмотрим на примере:

>>> elements = ['слон', 'кот', 'лошадь', 'змея', 'рыба']
>>> if 'кот' in elements:
print('meow')

meow

Объединение списков

Списки в Python можно объединять с помощью оператора + или метода extend . Выглядит это так:

>>> a = [1, 3, 5]
>>> b = [1, 2, 4, 6]
>>> print(a + b)
[1, 3, 5, 1, 2, 4, 6]

>>> hello = ["h", "e", "l", "l", "o"]
>>> world = ["w", "o", "r", "l", "d"]
>>> hello.extend(world) # extends не возвращает новый список, а дополняет текущий
>>> print(hello)
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']

Копирование списка Python

Если вы захотите скопировать список оператором =, вы скопируете не сам список, а только его ссылку.

>>> a = [1, 2, 3]
>>> b = a # переменной b присваивается не значение списка a, а его адрес

>>> print(id(a), id(b))
56466376 56466376 # a и b ссылаются на один и тот же список

>>> b.append(4)
>>> print(a, b)
[1, 2, 3, 4] [1, 2, 3, 4]

Для копирования списков можно использовать несколько вариантов:

  • elements.copy() — встроенный метод copy (доступен с Python 3.3);
  • list(elements) — через встроенную функцию list() ;
  • copy.copy(elements) — функция copy() из пакета copy;
  • elements[:] — через создание среза (устаревший синтаксис).

Рассмотрим на примере каждый из этих способов:

>>> a = ["кот", "слон", "змея"]

>>> b = a.copy()
>>> print(id(a), id(b), a, b)
56467336 56467016 ['кот', 'слон', 'змея'] ['кот', 'слон', 'змея']

>>> d = list(a)
>>> print(id(a), id(d), a, d)
56467336 60493768 ['кот', 'слон', 'змея'] ['кот', 'слон', 'змея']

>>> import copy
>>> e = copy.copy(a) #
>>> print(id(a), id(e), a, e)
56467336 60491304 ['кот', 'слон', 'змея'] ['кот', 'слон', 'змея']

>>> f = copy.deepcopy(a)
>>> print(id(a), id(f), a, f)
56467336 56467400 ['кот', 'слон', 'змея'] ['кот', 'слон', 'змея']

>>> c = a[:] # устаревший синтаксис
>>> print(id(a), id(c), a, c)
56467336 60458408 ['кот', 'слон', 'змея'] ['кот', 'слон', 'змея']

Важно: copy.copy(a) делает поверхностное копирование. Объекты внутри списка будут скопированы как ссылки на них (как в случае с оператором =). Если необходимо рекурсивно копировать всех элементов в списке, используйте copy.deepcopy(a)

Скопировать часть списка можно с помощью срезов. Есть несколько вариантов использования:

>>> a = ["кот", "слон", "змея"]

>>> b = a[2:] # с 2-го элемента (включительно) до конца списка
>>> print(b)
['змея']

>>> c = a[:2] # с начала списка по 2-й элемент
>>> print(c)
['кот', 'слон']

>>> d = a[1:2] # с 1-го элемента (включительно) по 2-й элемент
>>> print(d)
['слон']

>>> a = [1, 2, 3, 4, 5, 6, 7, 8]
>>> e = a[0:8:2] # c 0-го элемента по 8-й элемент с шагом 2
>>> print(e)
[1, 3, 5, 7]

Цикл по списку

Для перебора списков в Python есть два цикла: for и while.

elements = [1, 2, 3, "meow"]
for el in elements:
print(el)

Результат выполнения:

1
2
3
meow

Попробуем построить цикл while. Он выполняется, когда есть какое-либо определённое условие:

elements = [1, 2, 3, "meow"]
elements_len = len(elements)
i = 0
while i < elements_len:
print(elements[i])
i += 1

Результат выполнения:

1
2
3
meow

Из примеров выше можем сделать вывод, что конструкция for выглядит заметно компактнее, чем while.

Методы списков

  • list.append(x) — позволяет добавлять элемент в конец списка;
  • list1.extend(list2) — предназначен для сложения списков;
  • list.insert(i, x) — служит для добавления элемента на указанную позицию(i — позиция, x — элемент);
  • list.remove(x) — удаляет элемент из списка (только первое вхождение);
  • list.clear() — предназначен для удаления всех элементов (после этой операции список становится пустым []);
  • list.copy() — служит для копирования списков.
  • list.count(x) — посчитает количество элементов x в списке;
  • list.index(x) — вернет позицию первого найденного элемента x в списке;
  • list.pop(i) — удалит элемент из позиции i ;
  • list.reverse() — меняет порядок элементов в списке на противоположный;
  • list.sort() — сортирует список.

Пример использования методов:

# append
>>> a = [1, 2, 3]
>>> a.append(4)
print(a)
[1, 2, 3, 4]

# extend
>>> elements = [1, 2, 3, "meow"]
>>> elements.extend([4, 5, "gaf"])
>>> print(elements)
[1, 2, 3, 'meow', 4, 5, 'gaf']

# insert
>>> a = [1, 3, 4]
>>> a.insert(1, 2) # insert добавит на позицию 1 цифру 2
>>> print(a)
[1, 2, 3, 4]

# remove
>>> elements = [1, "meow", 3, "meow"]
>>> elements.remove("meow") # remove удалит только первое вхождение
>>> print(elements)
[1, 3, 'meow']

# clear
>>> a = [1, 2, 3]
>>> a.clear()
>>> print(a)
[]

# copy
>>> a = [1, 2, 3]
>>> b = a.copy()
>>> print(id(a), id(b), a, b)
60458408 60491880 [1, 2, 3] [1, 2, 3]

# count
>>> elements = ["one", "two", "three", "one", "two", "one"]
>>> print(elements.count("one"))
3

# index
>>> elements = ["one", "two", "three", "one", "two", "three"]
>>> print(elements.index("three")) # index вернет первый найденный индекс
2

# pop (положительный индекс)
>>> elements = [1, "meow", 3, "wow"]
>>> elements.pop(1) # удаляет элемент с индексом 1
'meow' # pop возвращает удаленный элемент списка
>>> print(elements)
[1, 3, 'wow']

# pop (отрицательный индекс) [удаление с конца списка, начиная с -1]
elements = ["hello", "world", "!"]
elements.pop(-2)
'world'
>>> print(elements)
['hello', '!']

# pop (без индекса) [удалит из списка последний элемент]
>>> elements = [1, 2, 3]
>>> elements.pop() # по умолчанию, в методе pop индекс равен -1
3
>>> print(elements)
[1, 2]

# reverse
>>> a = [1, 2, 3]
>>> a.reverse()
>>> print(a)
[3, 2, 1]

# sort (по возрастанию)
>>> elements = [3, 19, 0, 3, 102, 3, 1]
>>> elements.sort()
>>> print(elements)
[0, 1, 3, 3, 3, 19, 102]

# sort (по убыванию)
>>> elements = [3, 19, 0, 3, 102, 3, 1]
>>> elements.sort(reverse = True)
>>> print(elements)
[102, 19, 3, 3, 3, 1, 0]

Вложенные списки

Список может содержать объекты разных типов: числовые, буквенные, а также списки. Список списков выглядит следующим образом:

>>> elements = [1, 2, [0.1, 0.2, 0.3]]

Для обращения к элементу вложенного списка нужно использовать два индекса: первый указывает на индекс главного списка, второй — индекс элемента во вложенном списке. Вот пример:

>>> elements = [["яблоки", 50], ["апельсины", 190], ["груши", 100]]

>>> print(elements[0])
['яблоки', 50]

>>> print(elements[1][0])
апельсины

Срезы

Срезы (slices) — это подмножества элементов списка. Срезу нужны, когда необходимо извлечь часть списка из полного списка.

У них есть свой собственный синтаксис. Записывается срез так же, как обращение к элементу, используя индекс. Пример:

elements[START:STOP:STEP]

В этом случае берётся срез от номера start (включительно) до stop (не включая его), а step — это шаг. По умолчанию start и stop равны 0, step равен 1.

>>> elements = [0.1, 0.2, 1, 2, 3, 4, 0.3, 0.4]
>>> int_elements = elements[2:6] # с 2-го элемента включительно по 6-й элемент

>>> print(id(elements), id(int_elements)) # elements и int_elements - 2 разных списка
53219112 53183848

>>> print(elements)
[0.1, 0.2, 1, 2, 3, 4, 0.3, 0.4] # срез не модифицирует исходный список

>>> print(int_elements)
[1, 2, 3, 4]

Генераторы списков

Генератором списка называется способ построения списка с применением выражения к каждому элементу, входящему в последовательность. Есть схожесть генератора списка и цикла for. На этом примере мы рассмотрим простейший генератор списков:

>>> c = [c * 3 for c in 'list']

>>> print(c)
['lll', 'iii', 'sss', 'ttt']

Таким образом мы получили отдельно взятые утроенные буквы слова, введённого в кавычки. Есть множество вариантов применения генератора списков.

Пример генератора списка:

>>> nums = [i for i in range(1, 15)]
>>> print(nums)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

Пример посложнее:

>>> c = [c + d for c in 'list' if c != 'i' for d in 'spam' if d != 'a']
>>> print(c)
['ls', 'lp', 'lm', 'ss', 'sp', 'sm', 'ts', 'tp', 'tm']

Это усложнённая конструкция генератора списков, в которой мы сделали все возможные наборы сочетаний букв из введённых слов. Буквы-исключения видны по циклу, где стоит знак != для одной переменной и другой.

Best Practices

Последние абзацы статьи будут посвящены лучшим решениям практических задач, с которыми так или иначе сталкивается Python-разработчик.

Как получить список в обратном порядке

Изменить порядок размещения элементов в списке помогает функция list.reverse():

>>> elements = [1, 2, 3, 4, 5, 6]
>>> elements.reverse()

>>> print(elements)
[6, 5, 4, 3, 2, 1]

Как перевести список в другой формат?

Иногда требуется перевести список в строку, в словарь или в JSON. Для этого нужно будет вывести список без скобок.

Перевод списка в строку осуществляется с помощью функции join(). На примере это выглядит так:

>>> fruits = ["яблоко", "груша", "ананас"]

>>> print(', '.join(fruits))
яблоко, груша, ананас

В данном случае в качестве разделителя используется запятая.

Словарь в Python — это такая же встроенная структура данных, наряду со списком. Преобразование списка в словарь — задача тоже несложная. Для этого потребуется воспользоваться функцией dict(). Вот пример преобразования:

>>> elements = [['1', 'a'],['2', 'b'],['3', 'c']]
>>> my_dict = dict(elements)

>>> print(my_dict)
{'1': 'a', '2': 'b', '3': 'c'}

JSON — это JavaScript Object Notation. В Python находится встроенный модуль json для кодирования и декодирования данных JSON. С применением метода json.dumps(x) можно запросто преобразовать список в строку JSON.

>>> import json
>>> json.dumps(['word', 'eye', 'ear'])
'["word", "eye", "ear"]'

Как узнать индекс элемента в списке?

Узнать позицию элемента в последовательности списка бывает необходимым, когда элементов много, вручную их не сосчитать, и нужно обращение по индексу. Для того чтобы узнать индекс элемента, используют функцию list.index(x).

>>> elements = [1, 3, 6, 9, 55]

>>> print(elements.index(9))
3

В качестве аргумента передаем значение, а на выходе получаем его индекс.

Как посчитать количество уникальных элементов в списке?

Самый простой способ — приведение списка к set (множеству). После этого останутся только уникальные элементы, которые мы посчитаем функцией len():

>>> words = ["one", "two", "one", "three", "one"]
>>> len(set(words))
3

Как проверить список на пустоту?

>>> a = []
>>> if not a:
print("список пуст!")

список пуст!

Как создать список числовых элементов с шагом

Создание списка числовых элементов с шагом может понадобиться не так и часто, но мы рассмотрим пример построения такого списка.

Шагом называется переход от одного элемента к другому. Если шаг отрицательный, произойдёт реверс массива, то есть отсчёт пойдёт справа налево. Вот так выглядит список с шагом.

>>> elements = [1, 2, 3, 4, 5, 8, 9, 10, 11, 14, 20]
>>> print(elements[0:11:2])
[1, 3, 5, 9, 11, 20]

Еще один вариант — воспользоваться генератором списков:

>>> elements = [c for c in range(0, 10, 2)] # от 0 (включительно) до 10 с шагом 2

>>> print(elements)
[0, 2, 4, 6, 8]


При разработке на языке Python, списки встречаются довольно часто. Знание основ работы со списками поможет быстро и качественно писать программный код 😉.

Понравилась статья? Поделить с друзьями:
  • Разработка бизнес плана финансового оздоровления предприятия
  • Рейтинг аутсорсинговых компаний москвы по отзывам работников
  • Разработка макета сайта интернет магазина страховой компании
  • Разрешаемое время непрерывной работы учащихся за компьютером
  • Разрешенное время проведения строительных работ в жилом доме