Списки в Python
Списки в Python — это универсальная структура данных, которая позволяет хранить и организовывать коллекции элементов. Списки являются одним из наиболее распространенных и мощных инструментов в Python, и широко используются во множестве приложений и задач программирования.
Списки в Python являются упорядоченными, изменяемыми и индексируемыми коллекциями. Это означает, что элементы списка имеют определенный порядок и могут быть доступны по индексу. Это делает списки в Python очень гибкими и удобными для работы с коллекциями данных.
В этой статье мы рассмотрим основы работы со списками в Python, включая создание списков, доступ к и изменение элементов списка, а также основные операции, которые можно выполнять над списками. Мы также ознакомимся с некоторыми особенностями списков в Python, такими как индексация, срезы, копирование и объединение списков.
Создание списков в Python
Создание списка в Python — это процесс определения коллекции элементов, которые могут быть различных типов данных, и сохранение их в переменной с типом данных «список». Списки могут содержать элементы разных типов данных, таких как числа, строки, булевы значения, а также другие списки или даже пользовательские объекты.
Существует несколько способов создания списков в Python. Один из наиболее распространенных способов — это использование квадратных скобок ([]), внутри которых перечисляются элементы списка, разделенные запятыми. Например:
my_list = [1, 2, 3, 4, 5] # создание списка с целыми числами
Также можно создать пустой список, используя пустые квадратные скобки:
empty_list = [] # создание пустого списка
Списки могут содержать элементы разных типов данных, например:
mixed_list = [1, "hello", True, 3.14] # создание списка с элементами различных типов данных
Кроме того, существуют встроенные функции Python, такие как list() , которые могут быть использованы для создания списков из других коллекций данных, таких как строки, кортежи или даже других списков.
my_string = "hello" # создание строки string_list = list(my_string) # создание списка из строки
Также можно использовать генераторы списков, которые представляют собой компактный способ создания списков на основе итерации или условных выражений.
squares = [x ** 2 for x in range(1, 6)] # создание списка квадратов чисел от 1 до 5
Создание списков в Python — это первый шаг в работе с этой мощной структурой данных, и оно предоставляет гибкость и удобство для организации и манипулирования коллекциями элементов.
Доступ к элементам списка в Python
Одна из основных операций при работе со списками — это доступ к их элементам. В Python это делается с помощью индексирования элементов списка. Индексирование в Python начинается с 0, то есть первый элемент списка имеет индекс 0, второй — индекс 1, и так далее.
Для доступа к элементам списка используется имя списка, за которым в квадратных скобках указывается индекс элемента, например:
my_list = [1, 2, 3, 4, 5] # создание списка с целыми числами print(my_list[0]) # вывод первого элемента списка, результат: 1
Также можно использовать отрицательные индексы, которые отсчитываются с конца списка. Например, -1 соответствует последнему элементу списка, -2 — предпоследнему, и так далее:
print(my_list[-1]) # вывод последнего элемента списка, результат: 5
Кроме того, можно использовать диапазоны индексов (срезы), чтобы получить сразу несколько элементов списка. Диапазон указывается в квадратных скобках через двоеточие. Например:
print(my_list[1:4]) # вывод элементов списка с индексами 1, 2, 3, результат: [2, 3, 4]
Здесь указан диапазон индексов от 1 до 4, при этом первый индекс включается в результат, а последний — нет.
Если не указывать начальный и конечный индексы, то будут использоваться значения по умолчанию: начальный индекс 0 и конечный индекс -1 (последний элемент списка). Например:
print(my_list[:3]) # вывод элементов списка с индексами 0, 1, 2, результат: [1, 2, 3] print(my_list[2:]) # вывод элементов списка с индексами 2, 3, 4, результат: [3, 4, 5]
Доступ к элементам списка в Python является одной из основных операций, которая позволяет получать и изменять значения элементов списка, и она является основой для множества операций работы со списками.
Изменение элементов списка в Python
Одной из важных возможностей списков в Python является возможность изменять значения элементов списка. Это позволяет динамически обновлять содержимое списка в процессе выполнения программы.
Для изменения значения элемента списка используется индекс элемента, за которым присваивается новое значение. Например:
my_list = [1, 2, 3, 4, 5] # создание списка с целыми числами my_list[2] = 10 # изменение значения элемента с индексом 2 на 10 print(my_list) # вывод списка после изменения, результат: [1, 2, 10, 4, 5]
В данном примере значение элемента списка с индексом 2 было изменено на 10.
Также можно использовать отрицательные индексы и диапазоны индексов, как при доступе к элементам списка. Например:
my_list[-1] = 50 # изменение значения последнего элемента списка на 50 print(my_list) # вывод списка после изменения, результат: [1, 2, 10, 4, 50]
my_list[1:4] = [20, 30, 40] # изменение значений элементов списка с индексами 1, 2, 3 print(my_list) # вывод списка после изменения, результат: [1, 20, 30, 40, 50]
Здесь мы использовали срез списка [1:4] для замены значений элементов с индексами 1, 2, 3 на новые значения 20, 30, 40 соответственно.
Изменение элементов списка в Python позволяет динамически обновлять содержимое списка, что делает списки мощным инструментом для работы с коллекциями данных.
Добавление и удаление элементов списка в Python
Одним из важных аспектов работы со списками в Python является возможность добавлять новые элементы в список или удалять существующие. Это позволяет динамически изменять размер и содержимое списка в процессе выполнения программы.
Для добавления новых элементов в список используется метод append() или оператор += . Например:
my_list = [1, 2, 3] # создание списка с целыми числами my_list.append(4) # добавление нового элемента со значением 4 в конец списка print(my_list) # вывод списка после добавления, результат: [1, 2, 3, 4]
my_list = [1, 2, 3] # создание списка с целыми числами my_list += [4, 5] # добавление нескольких элементов в конец списка print(my_list) # вывод списка после добавления, результат: [1, 2, 3, 4, 5]
Для удаления элементов из списка можно использовать несколько методов, таких как remove() , pop() и del . Например:
my_list = [1, 2, 3, 4, 5] # создание списка с целыми числами my_list.remove(3) # удаление элемента со значением 3 из списка print(my_list) # вывод списка после удаления, результат: [1, 2, 4, 5]
my_list = [1, 2, 3, 4, 5] # создание списка с целыми числами removed_item = my_list.pop(2) # удаление элемента с индексом 2 и сохранение его значения в переменной print(my_list) # вывод списка после удаления, результат: [1, 2, 4, 5] print(removed_item) # вывод удаленного значения, результат: 3
my_list = [1, 2, 3, 4, 5] # создание списка с целыми числами del my_list[1] # удаление элемента с индексом 1 из списка print(my_list) # вывод списка после удаления, результат: [1, 3, 4, 5]
Эти методы и операторы позволяют добавлять новые элементы в список или удалять существующие, что делает списки в Python гибким инструментом для работы с коллекциями данных.
Копирование и объединение списков в Python
При работе со списками в Python, иногда требуется создать копию списка или объединить несколько списков в один. Python предоставляет несколько способов для выполнения этих операций.
Для создания копии списка можно использовать метод copy() или срез списка. Например:
my_list = [1, 2, 3, 4, 5] # создание списка с целыми числами my_list_copy = my_list.copy() # создание копии списка print(my_list_copy) # вывод копии списка, результат: [1, 2, 3, 4, 5]
my_list = [1, 2, 3, 4, 5] # создание списка с целыми числами my_list_copy = my_list[:] # создание копии списка с помощью среза print(my_list_copy) # вывод копии списка, результат: [1, 2, 3, 4, 5]
Обратите внимание, что создание копии с использованием метода copy() или среза создает новый объект списка, который является независимым от оригинала. Изменения в копии списка не будут влиять на оригинальный список, и наоборот.
Для объединения нескольких списков в один можно использовать оператор + или метод extend() . Например:
list1 = [1, 2, 3] # создание первого списка list2 = [4, 5, 6] # создание второго списка merged_list = list1 + list2 # объединение списков с использованием оператора + print(merged_list) # вывод объединенного списка, результат: [1, 2, 3, 4, 5, 6]
list1 = [1, 2, 3] # создание первого списка list2 = [4, 5, 6] # создание второго списка list1.extend(list2) # объединение списков с использованием метода extend() print(list1) # вывод объединенного списка, результат: [1, 2, 3, 4, 5, 6]
Объединение списков позволяет создавать новый список, содержащий элементы из нескольких исходных списков. Это может быть полезно, например, при объединении данных из разных источников или при создании нового списка на основе нескольких списков.
Итерирование по спискам в Python
Итерирование, или проход по элементам списка, является одной из основных операций при работе со списками в Python. Python предоставляет несколько способов для итерирования по спискам и доступа к их элементам.
Цикл for
Цикл for в Python позволяет итерироваться по элементам списка один за другим без явного использования индексов. Пример использования цикла for для итерирования по списку:
my_list = [1, 2, 3, 4, 5] # создание списка с целыми числами for item in my_list: # итерирование по элементам списка print(item) # вывод элемента списка на каждой итерации
1 2 3 4 5
Использование индексов
Можно использовать индексы элементов списка в цикле for, чтобы получать доступ к элементам списка по их индексам. Пример использования индексов для итерирования по списку:
my_list = [1, 2, 3, 4, 5] # создание списка с целыми числами for i in range(len(my_list)): # итерирование по индексам элементов списка print(my_list[i]) # вывод элемента списка по индексу на каждой итерации
1 2 3 4 5
Использование функции enumerate()
Функция enumerate() в Python позволяет итерироваться по списку и получать одновременно и индекс, и значение элемента. Пример использования функции enumerate() для итерирования по списку:
my_list = [1, 2, 3, 4, 5] # создание списка с целыми числами for i, item in enumerate(my_list): # итерирование по элементам списка с использованием функции enumerate() print(f"Индекс: , Значение: ") # вывод индекса и значения элемента на каждой итерации
Индекс: 0, Значение: 1 Индекс: 1, Значение: 2 Индекс: 2, Значение: 3 Индекс: 3, Значение: 4 Индекс: 4, Значение: 5
Итерирование по спискам в Python позволяет обрабатывать элементы списка один за другим, выполнять над ними операции и получать доступ к их значениям и индексам. Это мощный инструмент при работе с списками и обработке данных.
Методы списков в Python
Python предоставляет множество встроенных методов для работы со списками, которые облегчают множество обычных операций, таких как добавление, удаление, поиск элементов и другие манипуляции с данными в списках.
Вот несколько распространенных методов списков в Python:
- append() : Добавляет элемент в конец списка.
- extend() : Объединяет два списка, добавляя элементы одного списка в конец другого.
- remove() : Удаляет первое вхождение указанного элемента из списка.
- index() : Находит индекс первого вхождения указанного элемента в списке.
- sort() : Сортирует список в порядке возрастания (по умолчанию) или в указанном порядке.
- reverse() : Разворачивает список на месте, меняя порядок элементов на обратный.
- count() : Возвращает количество вхождений указанного элемента в списке.
- copy() : Создает и возвращает копию списка.
- insert() : Вставляет элемент на указанную позицию в списке.
- pop() : Удаляет и возвращает элемент с указанной позиции в списке.
- clear() : Удаляет все элементы из списка.
- index() : Возвращает индекс первого вхождения указанного элемента в списке.
- len() : Возвращает количество элементов в списке.
- max() : Возвращает максимальный элемент в списке.
- min() : Возвращает минимальный элемент в списке.
Это только некоторые из множества методов, доступных в Python для работы со списками. Они облегчают множество операций, таких как добавление, удаление, сортировка, копирование и другие манипуляции с данными в списках.
Более подробно о функциях и методах списков читайте в нашей статье
Сортировка списков в Python
Сортировка списка – это процесс упорядочивания элементов списка по определенному критерию. В Python есть несколько способов сортировки списков, и в этом разделе мы рассмотрим основные из них.
Метод sort()
Это встроенный метод списка, который сортирует список на месте, изменяя порядок элементов в самом списке. Метод sort() имеет несколько параметров, таких как key , reverse , которые позволяют определить ключ сортировки и указать порядок сортировки (по возрастанию или убыванию). Пример:
my_list = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] my_list.sort() # сортировка по возрастанию print(my_list) # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9] my_list.sort(reverse=True) # сортировка по убыванию print(my_list) # [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
Функция sorted()
Это встроенная функция, которая возвращает новый отсортированный список на основе исходного, не изменяя его. Функция sorted() также принимает аргументы key и reverse для определения ключа сортировки и порядка сортировки. Пример:
my_list = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] sorted_list = sorted(my_list) # сортировка по возрастанию print(sorted_list) # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9] sorted_list_reverse = sorted(my_list, reverse=True) # сортировка по убыванию print(sorted_list_reverse) # [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
Метод sort() с параметром key
Параметр key позволяет указать функцию, которая будет использоваться в качестве ключа сортировки. Функция должна возвращать значение, по которому будет производиться сортировка. Пример:
my_list = ['apple', 'banana', 'cherry', 'date', 'fig', 'grape'] my_list.sort(key=len) # сортировка по длине элементов print(my_list) # ['fig', 'date', 'apple', 'grape', 'banana', 'cherry']
Функция sorted() с параметром key
Аналогично, параметр key может быть использован с функцией sorted() для указания функции ключа сортировки
my_list = ['apple', 'banana', 'cherry', 'date', 'fig', 'grape'] sorted_list = sorted(my_list, key=len) # сортировка по длине элементов print(sorted_list) # ['fig', 'date', 'apple', 'grape', 'banana', 'cherry']
Метод sort() и функция sorted() с параметром reverse
Параметр reverse позволяет указать порядок сортировки: True для сортировки в обратном порядке (по убыванию), и False (по умолчанию) для сортировки в прямом порядке (по возрастанию). Пример:
my_list = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] my_list.sort(reverse=True) # сортировка по убыванию print(my_list) # [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1] sorted_list = sorted(my_list, reverse=False) # сортировка по возрастанию print(sorted_list) # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
Метод reverse()
Это метод списка, который позволяет развернуть порядок элементов списка на месте, изменяя сам список. Пример:
my_list = [1, 2, 3, 4, 5] my_list.reverse() # разворот списка print(my_list) # [5, 4, 3, 2, 1]
Python. Сколько элементов можно положить в список?

Но всё так или иначе упрётся в ресурсы вашего компьютера) А именно в память.
Ответ написан более трёх лет назад
ldmitriy @ldmitriy Автор вопроса
Почему я не могу создать список из 2,147,483,647 элементов?
Иван Мельников @immelnikoff
ldmitriy, оперативной памяти не хватает?
ldmitriy @ldmitriy Автор вопроса

ldmitriy, смотрите, я для эксперимента заполнил список из 500млн записей

у меня на это ушло где-то ~3гб оперативки. Плюс у меня каждый элемент списка — это строка из 5 символов. У вас же это может быть абсолютно рандомный список из элементов разной длины. Поэтому может и не хватать оперативки, конечно
Иван Мельников @immelnikoff
ldmitriy,
Допустим у вас 32-битная ОС.
Список, в отличие от массива, устроен таким образом, что в самом списке хранятся только адреса (из 32-битного адресного пространства) расположения самих данных. При этом, хранить в памяти нужно и адреса (элементы списка), и сами данные.
Так вот, при создании списка, например, с 2,147,483,647 элементами только для хранения элементов списка (адресов) потребуется не менее 2,147,483,647 x 32 = 68,719,476,736 бит памяти, или 8,589,934,592 байт = 8 ГБ.
А ведь ещё нужно хранить сами данные. И не нужно забывать, что запущенный софт на машине тоже требует для своей работы память.
ldmitriy @ldmitriy Автор вопроса
Максим, это очень интересно. Попробовал Ваш пример и у меня вылетела memory error.
А как определили что ушло ~3гб оперативки? Через диспетчер?
Иван Мельников @immelnikoff
Максим, 500_000_000 x 4 байт = 2 ГБ. Что-то похоже. Получается, у вас 32-битная ОС или интерпретатор?

ldmitriy, да, через мониторинг системы. Просто открыл и наблюдал)
Иван Мельников, нее, я просто ограничил. Первый раз запустил без ограничений, у меня съелось 18гб памяти)) и я прервал этот процесс, даже не смотрел, сколько туда влезло элементов.
Иван Мельников @immelnikoff
Кол-во элементов списка ограничивается только доступным объемом ОЗУ.
Допустим у вас 32-битная ОС.
Список, в отличие от массива, устроен таким образом, что в самом списке хранятся только адреса (из 32-битного адресного пространства) расположения самих данных. При этом, хранить в памяти нужно и адреса (элементы списка), и сами данные.
Так вот, при создании списка, например, с 2,147,483,647 элементами только для хранения элементов списка (адресов) потребуется не менее 2,147,483,647 x 32 = 68,719,476,736 бит памяти, или 8,589,934,592 байт = 8 ГБ.
А ведь ещё нужно хранить сами данные. И не нужно забывать, что запущенный софт на машине тоже требует для своей работы память.
ps. Массивы гораздо эффективнее используют память, но есть ограничение – все элементы массива имеют единый заранее определенный тип.
Python Урок 4. Списки или массивы в Питоне
![]()
На уроке объясняется, как в языке python представлены списки (вместо массивов); объясняется про создание списков на Python.
Часть I: Коллекции: Списки / массивы
Списки (массивы) в Питоне, как и в других языках программирования, — это определенное количество элементов, которые имеют общее имя, и каждый элемент имеет свой индекс — порядковый номер. В отличие от массивов в других языках, у списков нет никаких ограничений на тип переменных, поэтому в них могут храниться объекты разного типа.
L - список целых чисел: L = [25, 755, -40, 57, -41]
В языке Python отсутствует такая структура, как «массив». Для работы с массивами используются списки.
Списки являются упорядоченными последовательностями, которые состоят из различных объектов (значений, данных), заключающихся в квадратные скобки [ ] и отделяющиеся друг от друга с помощью запятой.
В строку нельзя добавить новый символ или удалить существующий, не создав при этом новой строки.
Пример:
Так, например, в Питоне нельзя переприсваивать значение для отдельных символов строки.
Программа выдаст ошибку!
s="aaa"; s[1]="b"; print(s1)
Изменять строку можно только, работая с ней, как с объектом (метод replace , например):
s1="breKeKeKeKs"; s1=s1.replace('Ke','XoXo',2) s1 # breXoXoXoXoKeKs
s1=»breKeKeKeKs»; s1=s1.replace(‘Ke’,’XoXo’,2) s1 # breXoXoXoXoKeKs
Что касается списков, то при выполнении операций другие списки могут не создаваться, при этом изменяется непосредственно оригинал.
Из списков можно удалять и добавлять новые элементы.
Создание списков на Python
-
Создать список можно несколькими способами. Рассмотрим их.
1. Получение списка через присваивание конкретных значений
s = [] # Пустой список
s = [] # Пустой список
l = [25, 755, -40, 57, -41] # список целых чисел l = [1.13, 5.34, 12.63, 4.6, 34.0, 12.8] # список из дробных чисел l = ["Sveta", "Sergei", "Ivan", "Dasha"] # список из строк l = ["Москва", "Иванов", 12, 124] # смешанный список l = [[0, 0, 0], [1, 0, 1], [1, 1, 0]] # список, состоящий из списков l = ['s', 'p', ['isok'], 2] # список из значений и списка
l = [25, 755, -40, 57, -41] # список целых чисел l = [1.13, 5.34, 12.63, 4.6, 34.0, 12.8] # список из дробных чисел l = [«Sveta», «Sergei», «Ivan», «Dasha»] # список из строк l = [«Москва», «Иванов», 12, 124] # смешанный список l = [[0, 0, 0], [1, 0, 1], [1, 1, 0]] # список, состоящий из списков l = [‘s’, ‘p’, [‘isok’], 2] # список из значений и списка
2. Списки при помощи функции List()
Получаем список при помощи функции List()
empty_list = list() # пустой список l = list ('spisok') # 'spisok' - строка print(l) #['s', 'p', 'i', 's', 'o', 'k'] - результат - список
empty_list = list() # пустой список l = list (‘spisok’) # ‘spisok’ — строка print(l) #[‘s’, ‘p’, ‘i’, ‘s’, ‘o’, ‘k’] — результат — список
3. Создание списка при помощи функции Split()
- Используя функцию split в Питон можно получить из строки список. Рассмотрим пример:
stroka ="Hello, world" # stroka - строка lst=stroka.split(",") # lst - список lst # ['Hello', ' world']
stroka =»Hello, world» # stroka — строка lst=stroka.split(«,») # lst — список lst # [‘Hello’, ‘ world’]
4. Генераторы списков
- В python создать список можно также при помощи генераторов, — это довольно-таки новый метод:
- Пример 1:
Сложение одинаковых списков заменяется умножением:
# список из 10 элементов, заполненный единицами l = [1]*10 # список l = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
# список из 10 элементов, заполненный единицами l = [1]*10 # список l = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
l = [i for i in range(10)] # список l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
l = [i for i in range(10)] # список l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
l = [i*2 for i in range(10)] # список l = [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
l = [i*2 for i in range(10)] # список l = [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
l = [i*2 for i in range(10) if i % 2 == 0] # список l = [0, 4, 8, 12, 16]
l = [i*2 for i in range(10) if i % 2 == 0] # список l = [0, 4, 8, 12, 16]
c = [c * 3 for c in 'list'] print (c) # ['lll', 'iii', 'sss', 'ttt']
c = [c * 3 for c in ‘list’] print (c) # [‘lll’, ‘iii’, ‘sss’, ‘ttt’]
Пример:
Заполнить список квадратами чисел от 0 до 9, используя генератор списка.
l = [i*i for i in range(10)]
l = [i*i for i in range(10)]
l = [(i+1)+i for i in range(10)] print(l) # [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
l = [(i+1)+i for i in range(10)] print(l) # [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
from random import randint l = [randint(10,80) for x in range(10)] # 10 чисел, сгенерированных случайным образом в диапазоне (10,80)
from random import randint l = [randint(10,80) for x in range(10)] # 10 чисел, сгенерированных случайным образом в диапазоне (10,80)
Задание Python 4_1:
Создайте список целых чисел от -20 до 30 (генерация).
[-20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
Задание Python 4_2:
Создайте список целых чисел от -10 до 10 с шагом 2 (генерация list).
[-10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10]
Задание Python 4_3:
Создайте список из 20 пятерок (генерация).
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
Задание Python 4_4:
Создайте список из сумм троек чисел от 0 до 10, используя генератор списка (0 + 1 + 2, 1 + 2 + 3, …).
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33]
Задание Python 4_5 (сложное):
Заполните массив элементами арифметической прогрессии. Её первый элемент, разность и количество элементов нужно ввести с клавиатуры.
* Формула для получения n-го члена прогрессии: an = a1 + (n-1) * d
Простейшие операции над списками
- Списки можно складывать (конкатенировать) с помощью знака «+»:
l = [1, 3] + [4, 23] + [5] # Результат: # l = [1, 3, 4, 23, 5]
l = [1, 3] + [4, 23] + [5] # Результат: # l = [1, 3, 4, 23, 5]
[33, -12, 'may'] + [21, 48.5, 33] # [33, -12, 'may', 21, 48.5, 33]
[33, -12, ‘may’] + [21, 48.5, 33] # [33, -12, ‘may’, 21, 48.5, 33]
a=[33, -12, 'may'] b=[21, 48.5, 33] print(a+b)# [33, -12, 'may', 21, 48.5, 33]
a=[33, -12, ‘may’] b=[21, 48.5, 33] print(a+b)# [33, -12, ‘may’, 21, 48.5, 33]
[[0,0],[0,1],[1,1]] * 2 # [[0, 0], [0, 1], [1, 1], [0, 0], [0, 1], [1, 1]]
[[0,0],[0,1],[1,1]] * 2 # [[0, 0], [0, 1], [1, 1], [0, 0], [0, 1], [1, 1]]
Пример:
Для списков операция переприсваивания значения отдельного элемента списка разрешена!:
a=[3, 2, 1] a[1]=0; print(a) # [3, 0, 1]
a=[3, 2, 1] a[1]=0; print(a) # [3, 0, 1]
Задание 4_6:
В строке записана сумма натуральных чисел: ‘1+25+3’. Вычислите это выражение. Работать со строкой, как со списком.
s=input('введите строку') l=list(str(s));
s=input(‘введите строку’) l=list(str(s));
Как узнать длину списка?
В питоне не нужно явно указывать размер списка или вручную выделять на него память. Длину списка можно узнать с помощью встроенной функции len :
names = ['Ivan', 'Marie', 'Peter', 'Max'] print (len(names)) # 4
Ввод списка (массива) в языке Питон
L=[] L = [ int(input()) for i in range(5) ] # при вводе 1 2 3 4 5 print (L) # вывод: 1 2 3 4 5
L=[] L = [ int(input()) for i in range(5) ] # при вводе 1 2 3 4 5 print (L) # вывод: 1 2 3 4 5
Функция int здесь используется для того, чтобы строка, введенная пользователем, преобразовывалась в целые числа.
# вывод целого списка (массива) print (L) # поэлементный вывод списка (массива) for i in range(5): print ( L[i], end = " " )
# вывод целого списка (массива) print (L) # поэлементный вывод списка (массива) for i in range(5): print ( L[i], end = » » )
Задание Python 4_7:
Необходимо задать список (массив) из шести элементов; заполнить его вводимыми значениями и вывести элементы на экран. Использовать два цикла: первый — для ввода элементов, второй — для вывода.
Замечание: Для вывода через «,» используйте следующий синтаксис:
print ( L[i], end = ", " )
введите элементы массива: 3.0 0.8 0.56 4.3 23.8 0.7 Массив = 3, 0.8, 0.56, 4.3, 23.8, 0.7
Задание Python 4_8:
Заполните список случайными числами в диапазоне 20..100 и подсчитайте отдельно число чётных и нечётных элементов. Использовать цикл.
Задание Python 4_9: Найдите минимальный элемент списка. Выведите элемент и его индекс. Список из 10 элементов инициализируйте случайными числами. Для перебора элементов списка использовать цикл.
9 5 4 22 23 7 3 16 16 8 Минимальный элемент списка L[7]=3
9 5 4 22 23 7 3 16 16 8 Минимальный элемент списка L[7]=3
Часть II: Другие операции над списками при помощи функций и методов
a=[1,7,3,88,33] a.sort() #[1,3,7,33,88] - сортировка a.reverse() #[88,33,7,3,1] - обратная сортировка a.index(7) #2 - индекс элемента a.clear() # - очистка списка len(a) # - длина списка sum(a) # - суммирование элементов
a=[1,7,3,88,33] a.sort() #[1,3,7,33,88] — сортировка a.reverse() #[88,33,7,3,1] — обратная сортировка a.index(7) #2 — индекс элемента a.clear() # — очистка списка len(a) # — длина списка sum(a) # — суммирование элементов
lst=['11','22','33'] lst="-".join(lst)# '11-22-33'
str="1-2-3-4" s1=str.split("-") # ['1','2','3','4']
Задание 4_10:
Дан список из 5 различных элементов. Используя функции (не использовать цикл), необходимо найти и вывести:
- минимальный и максимальный элементы списка;
- сумму и среднее арифметическое;
- второй минимальный элемент (второй по минимальности).
Начало программы:
lst=[4,5,2,3,4]
Добавление и удаление элементов списка
- Добавление элемента, append() :
>>> a=[] >>> a.append('444') # ['444']
Пример:
Поиск нечетных элементов в списке mas и копирование их в список B.
mas = [1,5,2,7,6,9] B = [] for x in mas: if x % 2 != 0: B.append(x) # [1, 5, 7, 9]
mas = [1,5,2,7,6,9] B = [] for x in mas: if x % 2 != 0: B.append(x) # [1, 5, 7, 9]
mas = [1,5,2,7,6,9] B = [x for x in mas if x % 2 != 0] # [1, 5, 7, 9]
mas = [1,5,2,7,6,9] B = [x for x in mas if x % 2 != 0] # [1, 5, 7, 9]
names = ['Ivan', 'Marie', 'Peter', 'Max'] names.extend(['Kat', 'Mike']) print(names) #['Ivan', 'Marie', 'Peter', 'Max', 'Kat', 'Mike']
names = [‘Ivan’, ‘Marie’, ‘Peter’, ‘Max’] names.extend([‘Kat’, ‘Mike’]) print(names) #[‘Ivan’, ‘Marie’, ‘Peter’, ‘Max’, ‘Kat’, ‘Mike’]
names += ['Nick'] print(names) #['Ivan', 'Marie', 'Peter', 'Max', 'Kat', 'Mike', 'Nick']
names += [‘Nick’] print(names) #[‘Ivan’, ‘Marie’, ‘Peter’, ‘Max’, ‘Kat’, ‘Mike’, ‘Nick’]
a=['asd','444','555','77'] a.remove('444') # ['asd', '555', '77']
a=[‘asd’,’444′,’555′,’77’] a.remove(‘444’) # [‘asd’, ‘555’, ’77’]
a=['asd','444','555','77'] del a[0] # ['444', '555', '77']
a=[‘asd’,’444′,’555′,’77’] del a[0] # [‘444’, ‘555’, ’77’]
При копировании списков, т.е. присваивании одного списка другому, изменение первого списка влечет за собой изменение второго списка. Так как эти объекты связаны одной областью памяти (ссылка на список).
mas1 =[1, 2, 3] mas2 = mas1 # создается ссылка на список mas1[0] = 4 print(mas2) #[4, 2, 3]
mas1 =[1, 2, 3] mas2 = mas1 # создается ссылка на список mas1[0] = 4 print(mas2) #[4, 2, 3]
Чтобы создать не ссылку на список, а копию списка можно использовать либо срез либо функцию copy.
mas2 = mas1[:] # используем срез
mas2 = mas1[:] # используем срез
import copy mas1 =[1,2,3] mas2 = copy.copy(mas1)
import copy mas1 =[1,2,3] mas2 = copy.copy(mas1)
Задание 4_11: Проверить, является ли заданное слово палиндромом.
Примечание:
- Пример палиндрома: казак, ABBA
- Использовать функции.
- Поскольку при присваивании одного списка другому, изменение первого ведет к аналогичному изменению второго списка, то необходимо использовать копию ( copy ).
Начало программы:
import copy stroka=input('введите слово') lst=list (stroka) # конвертируем строку в список
import copy stroka=input(‘введите слово’) lst=list (stroka) # конвертируем строку в список
Ключевое слово «in»
Проверить, содержит ли список некоторый объект, можно с помощью ключевого слова « in «:
names = ['Ivan', 'Marie', 'Peter', 'Inna'] print('Marie' in names) # true
names = [‘Ivan’, ‘Marie’, ‘Peter’, ‘Inna’] print(‘Marie’ in names) # true
Генерация случайных чисел при работе со списками
Вспомним, как работать с модулем random .
Встроенный модуль Питона random позволяет генерировать псевдослучайные числа.
Модуль random включает в себя функцию random, которая возвращает действительное число в диапазоне от 0.0 до 1.0. Каждый раз при вызове функции возвращается число из длинного ряда.
Пример:
import random for i in range(10): x = random.random() print (x) # 0.5185207383774904 0.78283351055836 0.23601341583293534 .
import random for i in range(10): x = random.random() print (x) # 0.5185207383774904 0.78283351055836 0.23601341583293534 .
Чтобы получить случайное число между 0.0 и верхней границей high, просто умножьте x на high.
Например, от 0.0 до 15.0:
import random for i in range(10): x = random.random() print (x * 15) # 11.075319687990554 7.152253113207329 .
import random for i in range(10): x = random.random() print (x * 15) # 11.075319687990554 7.152253113207329 .
Для того, чтобы получить псевдослучайное целое число:
import random random.randint(начало>,конец>)
import random random.randint(,)
Для того, чтобы получить псевдослучайное вещественное число:
import random random.uniform(начало>,конец>)
import random random.uniform(,)
from random import randint l = [randint(10,80) for x in range(10)]
from random import randint l = [randint(10,80) for x in range(10)]
Задание Python 4_12:
Найдите в массиве все простые числа и скопируйте их в новый массив.
Задание Python 4_13:
Решить задачу поиска среднего значения в списке из N элементов (вводимых в виде строк). Использовать метод добавления элементов списка и суммирования элементов
Цикл for при работе со списками
mylist=[1,2,3,4,5] for item in mylist: item = 0 # mylist не меняется! print(mylist) # [1, 2, 3, 4, 5] n=5 for i in range(n): mylist[i] = 0 # mylist меняется print(mylist) # [0, 0, 0, 0, 0]
mylist=[1,2,3,4,5] for item in mylist: item = 0 # mylist не меняется! print(mylist) # [1, 2, 3, 4, 5] n=5 for i in range(n): mylist[i] = 0 # mylist меняется print(mylist) # [0, 0, 0, 0, 0]
В списке чисел проверить, все ли элементы являются уникальными, т.е. каждое число встречается только один раз
Комментарии к программе:
Решать данную задачу на языке Python мы будем «классическим» вариантом — брать по очереди элементы списка и сравнивать каждый элемент со стоящими за ним. При первом же совпадении элементов делается вывод, что в списке есть одинаковые элементы, и работа программы завершается.
Для выхода из цикла будем использовать метод quit()
import random m = 6 mass=[] k=0 j=0 for i in range(m): mass.append(random.randint(-10,10)) print(mass[i]) # -10 0 -8 0 -10 1 for i in mass: k=k+1 for j in range(k,m): # j = 0 -8 0 -10 -> quit if (i==mass[j]): # -10==0 -10==-8 -10==0 -10==-10 -> quit print('yes') quit()
import random m = 6 mass=[] k=0 j=0 for i in range(m): mass.append(random.randint(-10,10)) print(mass[i]) # -10 0 -8 0 -10 1 for i in mass: k=k+1 for j in range(k,m): # j = 0 -8 0 -10 -> quit if (i==mass[j]): # -10==0 -10==-8 -10==0 -10==-10 -> quit print(‘yes’) quit()

Задание Python 4_14: Определить индексы элементов массива (списка), значения которых принадлежат заданному диапазону (т.е. не меньше заданного минимума и не больше заданного максимума)
* в результате получили индексы элементов, значения которых находятся в диапазоне [5,15]
Алгоритм:
- Заполнить список (массив) случайными числами
- Запросить для ввода минимум и максимум диапазона
- Найти индексы элементов, значения которых входят в диапазон. Добавлять найденные индексы к новому списку
- Вывести общее число найденных индексов (функция len()) и отдельно все индексы
Задание Python 4_15: Дополнить предыдущую программу следующим:
После того, как элемент с подходящим значением добавлен в новый список – удалять его из исходного списка
* Использовать цикл while , функцию len()
Списки¶
Разработчики Python имели широкий выбор, когда реализовывали списки как структуру данных. Каждое их решение оказывает влияние на скорость выполнения операций со списками. Чтобы принять верное решение, они смотрели на то, для чего пользователи используют списки чаще всего, и оптимизировали реализацию таким образом, чтобы наиболее распространённые операции совершались очень быстро. Конечно, разработчики так же старались сделать быстрыми и менее используемые операции, но при поиске компромиссов производительность последних приносилась в жертву более распространённым.
Двумя наиболее частыми операциями над списками являются индексация и присваивание на заданную позицию. Обе они занимают равное количество времени, вне зависимости от того, насколько велик список. Когда операции не зависят от размера списка (как названные выше), говорят, что они имеют \(O(1)\)
Другим часто встречающимся программистским заданием является увеличение списка. Существует два способа продлить список. Вы можете использовать метод добавления или оператор конкатенации. Первый является \(O(1)\) , но вот второй имеет \(O(k)\) , где \(k\) — размер списка, который будет присоединён. Польза от этой информации в том, что она помогает сделать ваши программы более эффективными, выбирая правильный инструмент для работы.
Давайте рассмотрим четыре разных способа сгенерировать список из n чисел, начинающийся с нуля. Сначала мы попробуем цикл for и создадим список с помощью конкатенации. Затем используем для этого метод append . Далее попытаемся создать список, используя генераторы списков. И, наконец, используем для этого, возможно, самый очевидный способ — функцию range , обёрнутую в конструктор списка. Листинг 3 показывает код для всех этих четырёх способов.
Листинг 3
def test1(): l = [] for i in range(1000): l = l + [i] def test2(): l = [] for i in range(1000): l.append(i) def test3(): l = [i for i in range(1000)] def test4(): l = list(range(1000))
Чтобы получить время, требуемое для выполнения каждой функции, мы используем модуль Python timeit . Он разработан для того, чтобы разработчики могли делать кроссплатформенные синхронные измерения, запуская функции в согласованной среде и используя механизмы синхронизации, максимально схожие между собой для разных операционных систем.
Чтобы использовать timeit , вам нужно создать объект Timer , чьими параметрами являются два оператора Python. Первый из них сообщает, что вам нужно время; второй — что тест будет проводиться один раз. Модуль timeit замерит время, необходимое для выполнения операции, несколько раз. По умолчанию он попытается запустить операцию один миллион раз. Когда это будет сделано, время вернётся, как число с плавающей запятой, представляющее собой общее количество секунд. Однако, поскольку оператор вычислялся миллион раз, то вы можете прочитать результат, как количество микросекунд, затраченных на выполнение одного теста. Так же в timeit можно передать именованный параметр number , который позволит вам конкретизировать, сколько раз нужно запустить оператор. Следующий фрагмент показывает, как долго занимает запуск каждой тестовой функции тысячу раз.
t1 = Timer("test1()", "from __main__ import test1") print("concat ",t1.timeit(number=1000), "milliseconds") t2 = Timer("test2()", "from __main__ import test2") print("append ",t2.timeit(number=1000), "milliseconds") t3 = Timer("test3()", "from __main__ import test3") print("comprehension ",t3.timeit(number=1000), "milliseconds") t4 = Timer("test4()", "from __main__ import test4") print("list range ",t4.timeit(number=1000), "milliseconds") concat 6.54352807999 milliseconds append 0.306292057037 milliseconds comprehension 0.147661924362 milliseconds list range 0.0655000209808 milliseconds
В эксперименте выше мы замеряли время для функций test1() , test2() и так далее. Оператор начальной установки может показать вам очень необычным, так что давайте разберём детали. Возможно, вы хорошо знакомы с операторами from и import` , но они обычно используются в начале файлов программ на Python. В этом случае, оператор from __main__ import test1 импортирует функцию test1 из пространства имён __main__ в пространство имён, где ставит свой временн*о*й эксперимент timeit . Это делается, чтобы запускать тесты в среде с отсутствующими бродячими переменными, которые вы могли ненароком создать и которые могут повлиять на производительность функции непредвиденным образом.
Из эксперимента выше совершенно ясно, что операция append с 0.30 миллисекундами быстрее, чем конкатенация с её 6.54 миллисекундами. Также мы видим время, требуемое для двух дополнительных методов создания списков: использования конструктора списка с вызовом range и генератора списков. Интересно, что последний в два раза быстрее, чем цикл for с операцией append .
Наше последнее наблюдение в этом маленьком эксперименте заключается в том, что все времена, которые вы видите выше, содержат некоторые издержки при фактическом вызове тестовой функции. Однако, мы можем предположить, что для всех четырёх случаев эта величина одинакова, так что мы по-прежнему имеем адекватное сравнение операций. Поэтому правильно говорить не “конкатенация занимает 6.54 миллисекунд”, а “тестовая функция конкатенации выполняется 6.54 миллисекунд”. В качестве упражнения, вы можете провести временн*о*й тест для пустой функции и вычесть его результат из чисел выше.
После того, как мы увидели, как конкретно может быть измерена производительность, вы можете посмотреть в таблицу 2, чтобы узнать эффективность в терминах “большого О” для основных операций над списками. После вдумчивого размышления над ней, вы можете заинтересоваться двумя разными временами для pop . Когда этот метод вызывается для конца списка, это занимает \(O(1)\) . Но когда pop вызывают для первого или любого другого элемента из середины списка, он имеет \(O(n)\) . Причина кроется в том, как в Python выбрана реализация списков. Когда элемент берётся из начала списка, то все прочие элементы смещаются на одну позицию вперёд. Сейчас это может показаться вам глупым, но если вы посмотрите на таблицу 2, то увидите, что эта же реализация позволяет операции индексации иметь \(O(1)\) . Это один из тех компромиссов, которые разработчики Python сочли разумными.
| Операция | Эффективность |
|---|---|
| index [] | O(1) |
| Присваивание по индексу | O(1) |
| append | O(1) |
| pop() | O(1) |
| pop(i) | O(n) |
| insert(i,item) | O(n) |
| оператор del | O(n) |
| итерирование | O(n) |
| вхождение (in) | O(n) |
| срез [x:y] | O(k) |
| удалить срез | O(n) |
| задать срез | O(n+k) |
| обратить | O(n) |
| конкантенация | O(k) |
| сортировка | O(n log n) |
| размножить | O(nk) |
В качестве способа демонстрации этих различий в производительности, давайте проведём другой эксперимент с использованием модуля timeit . Нашей целью будет возможность проверки производительности операции pop на списке известного размера, когда программа выталкивает элемент из конца списка, и ещё раз — когда программа вталкивает элемент из начала списка. Мы также произведём замеры времени на списках разной длины. Что мы ожидаем увидеть, так это то, что временн*а*я зависимость у выталкивания из конца списка остаётся одинаковой при увеличении списка, в то время как выталкивание из начала списка будет расти вместе с его длиной.
Листинг 10 демонстрирует попытку замерить разницу между двумя использованиями pop . Как видно из первого примера, выталкивание с конца занимает 0.0003 миллисекунды, в то время как на выталкивание из начала требуется 4.82 миллисекунды. Для списка в два миллиона элементов коэффициент будет 16 000.
Есть ещё несколько замечаний относительно листинга 4. Первое — это оператор from __main__ import x . Несмотря на то, что мы не определяли функцию, мы хотим иметь возможность использовать список-объект x в нашем тесте. Этот подход позволяет нам замерять время только для единственной pop -операции и получать для неё наиболее точное значение. Поскольку замеры повторяются тысячу раз, то также важно отметить, что список уменьшается в размерах на единицу за каждую итерацию. Но поскольку изначально в нём два миллиона элементов, то общий объём уменьшится примерно на \(0.05\%\)
Листинг 4
popzero = timeit.Timer("x.pop(0)", "from __main__ import x") popend = timeit.Timer("x.pop()", "from __main__ import x") x = list(range(2000000)) popzero.timeit(number=1000) 4.8213560581207275 x = list(range(2000000)) popend.timeit(number=1000) 0.0003161430358886719
Пока наш первый тест показывает, что pop(0) действительно медленнее pop() . Но он не подтверждает заявление, что pop(0) является \(O(n)\) , в то время как pop() — \(O(1)\) . Чтобы доказать это, нам нужно рассмотреть производительность обоих вызовов на диапазоне размеров списков. Листинг 5 содержит этот тест.
Листинг 5
popzero = Timer("x.pop(0)", "from __main__ import x") popend = Timer("x.pop()", "from __main__ import x") print("pop(0) pop()") for i in range(1000000,100000001,1000000): x = list(range(i)) pt = popend.timeit(number=1000) x = list(range(i)) pz = popzero.timeit(number=1000) print("%15.5f, %15.5f" %(pz,pt))
На рисунке 3 показаны результаты нашего эксперимента. Вы можете видеть, как список становится всё длиннее и длиннее, а время, необходимое для pop(0) — больше и больше, тогда как график для pop остаётся плоским. Это в точности то, что мы ожидали увидеть от алгоритмов с \(O(n)\) и \(O(1)\)
Некоторым источником ошибок в нашем маленьком эксперименте стал тот факт, что на компьютере запущены и другие процессы, которые могут замедлять код. Несмотря на то, что мы старались минимизировать влияние прочих происходящих в компьютере вещей, с ними связаны некоторые флуктуации времён. Именно поэтому цикл выполняет тест тысячу раз — в первую очередь, чтобы статистически собрать достаточно информации для утверждения о надёжности измерений.

Рисунок 3: Сравнение производительности pop и pop(0)
readers online now | | Back to top
© Copyright 2014 Brad Miller, David Ranum. Created using Sphinx 1.2.3.
