Что такое список в программировании
Перейти к содержимому

Что такое список в программировании

  • автор:

Списки (list). Функции и методы списков

Python 3 логотип

Сегодня я расскажу о таком типе данных, как списки, операциях над ними и методах, о генераторах списков и о применении списков.

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

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

Чтобы использовать списки, их нужно создать. Создать список можно несколькими способами. Например, можно обработать любой итерируемый объект (например, строку) встроенной функцией list:

Список можно создать и при помощи литерала:

Как видно из примера, список может содержать любое количество любых объектов (в том числе и вложенные списки), или не содержать ничего.

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

Возможна и более сложная конструкция генератора списков:

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

Функции и методы списков

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

Таблица «методы списков»

Метод Что делает
list.append(x) Добавляет элемент в конец списка
list.extend(L) Расширяет список list, добавляя в конец все элементы списка L
list.insert(i, x) Вставляет на i-ый элемент значение x
list.remove(x) Удаляет первый элемент в списке, имеющий значение x. ValueError, если такого элемента не существует
list.pop([i]) Удаляет i-ый элемент и возвращает его. Если индекс не указан, удаляется последний элемент
list.index(x, [start [, end]]) Возвращает положение первого элемента со значением x (при этом поиск ведется от start до end)
list.count(x) Возвращает количество элементов со значением x
list.sort([key=функция]) Сортирует список на основе функции
list.reverse() Разворачивает список
list.copy() Поверхностная копия списка
list.clear() Очищает список

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

   И, напоследок, примеры работы со списками:

Изредка, для увеличения производительности, списки заменяют гораздо менее гибкими массивами (хотя в таких случаях обычно используют сторонние библиотеки, например NumPy).

Для вставки кода на Python в комментарий заключайте его в теги

  • Модуль csv - чтение и запись CSV файлов
  • Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
  • Онлайн-обучение Python: сравнение популярных программ
  • Книги о Python
  • GUI (графический интерфейс пользователя)
  • Курсы Python
  • Модули
  • Новости мира Python
  • NumPy
  • Обработка данных
  • Основы программирования
  • Примеры программ
  • Типы данных в Python
  • Видео
  • Python для Web
  • Работа для Python-программистов
  • Сделай свой вклад в развитие сайта!
  • Самоучитель Python
  • Карта сайта
  • Отзывы на книги по Python
  • Реклама на сайте

Что такое список в программировании

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

Каждый элемент должен хранить ссылки на последующий и предыдущий элемент. Для того, чтобы отделить хранимые объекты от способа хранения вводится вспомогательный объект УЗЕЛ (Node).

Возможны различные реализации списков:

Узел - объекты, который содержит ссылки на последующий и предыдущий элементы, а также значение данного элемента списка.

Списки в стандартной библиотеке C++ являются двусвязными. Поэтому список поддерживает вставку в начало (push_front) и в конец (push_back). Кроме того новые элементы можно вставить в любое место списка (insert). При этом не потребуется переразмещение всей структуры данных. Полный список функций вектора см. Приложение 5.

3.4.2. Итераторы

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

Итератор - это объект, который представляет собой обобщение понятия указатель. Это обобщённый "указатель" на элемент, хранящийся в контейнере. Применение оператора * приведет к разыменованию и получению доступа к значению элемента. А использование операторов ++ и -- позволит получить указатель на следующий и предыдущий элемент, хранимый в контейнере. Все контейнеры должны предоставлять несколько ключевых функций-членов, которые позволяют программисту получить итераторы на первый и последний элемент контейнера, то есть найти "концы" последовательности элемента контейнера.

listdouble> ls; listdouble>::iterator it; it=ls.begin(); // итератор на первый элемент контейнера it=ls.end(); // итератор на следующий после последнего элемент контейнера it--; // операторы «++» и «– –» получение указателя на следующий и предыдущий элемент it++; (*it)=5; // оператор * – разыменование и получение доступа к значению элемента // последовательный перебор всех элементов списка через цикл for for(it=x.begin(); it!=x.end(); it++) < sum+=(*it); //доступ к элементам по итератору > // последовательный перебор всех элементов списка через цикл while it=x.begin(); while(it!=x.end())

3.4.3. Пример работы со списком с использованием итераторов (пример 3.4)

Рассмотрим пример работы со списком с использванием итераторов.

///////////////////////////////////////////////////////////////////////////// // Прикладное программирование // Пример 3.4. Пример работы с контейнером list // // Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru // Университет ИТМО ///////////////////////////////////////////////////////////////////////////// #include // подключение библиотеки ввода-вывода #include // подключение описания списка #include // для работы с файлами using namespace std; // подключение стандартного пространства имен для использования библиотек // прототипы функций void read_from_file(listint>& data, const string& filename); ///////////////////////////////////////////////////////////////////////////// // Функция чтения конейнера list из файла // data - контейнер для заполнения // filename - имя файла void read_from_file(listint>& data, const string& filename) < ifstream ifile(filename); // создание потока ввода из файла по его имени data.clear(); // очистить контейнер int value; // цикл будет выполняться до тех пор, пока не встретиться конец файла while(!ifile.eof()) < ifile>>value; // читаем число из файла data.push_back(value); // записываем прочитанное число в конец контейнера > > /////////////////////////////////////////////////////////////////////////////// void main() < listint> x; // объявление контейнера listint>::iterator it; // объявление итератора // пример работы с контейнером x.push_back(0); // вставка в конец x.push_back(1); // вставка в конец x.push_back(2); // вставка в конец // x = 0 1 2 x.push_front(5); // вставка в начало // x = 5 0 1 2 it=x.begin(); it++; x.insert(it, 3); // вставка перед итератором it // x = 5 3 0 1 2 // вывод всех элементов контейнера for(it=x.begin(); it!=x.end(); it++) < cout" "; //доступ к элементам по итератору > cout// чтение элементов списка из файла read_from_file(x, "list_data.txt"); // вывод всех элементов контейнера for(it=x.begin(); it!=x.end(); it++) < cout" "; //доступ к элементам по итератору > cout// вычисление суммы всех значений контейнера int sum=0; it=x.begin(); while(it!=x.end()) < sum+=*it; it++; >cout"sum=" /////////////////////////////////////////////////////////////////////////////// 

Списки

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

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

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

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

>>> a = [12, 3.85, "black", -4] >>> a [12, 3.85, 'black', -4]

Итак, у нас имеется список, присвоенный переменной a . В Python список определяется квадратными скобками. Он содержит четыре элемента. Если где-то в программе нам понадобится весь этот список, мы получим доступ к нему, указав всего лишь одну переменную – a .

Элементы в списке упорядочены, то есть имеет значение, в каком порядке они расположены. Каждому элементу соответствует свой индекс, или номер. Индексация начинается с нуля. В данном случае число 12 имеет индекс 0, строка "black" – индекс 2. Чтобы извлечь определенный элемент, надо после имени переменной указать в квадратных скобках его индекс:

>>> a = [12, 3.85, "black", -4] >>> a[0] 12 >>> a[3] -4

В Python существует также индексация с конца. Она начинается с -1:

>>> a[-1] -4 >>> a[-2] 'black' >>> a[-3], a[-4] (3.85, 12)

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

>>> a[0:2] [12, 3.85]

В данном случае извлекаются первые два элемента с индексами 0 и 1. Элемент с индексом 2 в срез уже не входит. В таком случае возникает вопрос, как извлечь срез, включающий в себя последний элемент? Если какой-либо индекс не указан, то считается, что имеется в виду начало или конец:

>>> a = [12, 3.85, "black", -4] >>> a[:3] [12, 3.85, 'black'] >>> a[2:] ['black', -4] >>> a[:] [12, 3.85, 'black', -4]

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

>>> a[1] = 4 >>> a [12, 4, 'black', -4]

Добавлять и удалять лучше с помощью специальных встроенных методов списка:

>>> a.append('wood') >>> a [12, 4, 'black', -4, 'wood'] >>> a.insert(1, 'circle') >>> a [12, 'circle', 4, 'black', -4, 'wood'] >>> a.remove(4) >>> a [12, 'circle', 'black', -4, 'wood'] >>> a.pop() 'wood' >>> a [12, 'circle', 'black', -4] >>> a.pop(2) 'black' >>> a [12, 'circle', -4]

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

Для получения информации о конкретном методе следует воспользоваться встроенной функцией help() , передав ей в качестве аргумента имя метода, связанное с объектом или классом. Например, help(a.pop) или help(list.index) . Выход из справки – q.

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

>>> b = [1, 2, 3, 4, 5, 6] >>> b = b[:2] + b[3:] >>> b [1, 2, 4, 5, 6]

Здесь берется срез из первых двух элементов и срез, начиная с четвертого элемента (индекс 3) и до конца. После чего срезы объединяются с помощью оператора "сложения".

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

>>> mylist = ['ab','ra','ka','da','bra'] >>> mylist[0:2] = [10, 20] >>> mylist [10, 20, 'ka', 'da', 'bra']

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

>>> import random >>> c = [] >>> i = 0 >>> while i < 10: . c.append(random.randint(0,100)) . i += 1 . >>> c [30, 44, 35, 77, 53, 44, 49, 17, 61, 82]

Практическая работа

  1. Напишите программу, которая запрашивает с ввода восемь чисел, добавляет их в список. На экран выводит их сумму, максимальное и минимальное из них. Для нахождения суммы, максимума и минимума воспользуйтесь встроенными в Python функциями sum() , max() и min() .
  2. Напишите программу, которая генерирует сто случайных вещественных чисел и заполняет ими список. Выводит получившийся список на экран по десять элементов в ряд. Далее сортирует список с помощью метода sort() и снова выводит его на экран по десять элементов в строке. Для вывода списка напишите отдельную функцию, в качестве аргумента она должна принимать список.

Примеры решения и дополнительные уроки в pdf-версии курса

X Скрыть Наверх

Python. Введение в программирование

Список (информатика)

В информатике, спи́сок (англ. list ) — это абстрактный тип данных, представляющий собой упорядоченный набор значений, в котором некоторое значение может встречаться более одного раза. Экземпляр списка является компьютерной реализацией математического понятия конечной последовательности — кортежа. Экземпляры значений, находящихся в списке, называются элементами списка (англ. item, entry либо element ); если значение встречается несколько раз, каждое вхождение считается отдельным элементом.

Структура односвязного списка из трёх элементов

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

Определение

При помощи нотации метода синтаксически-ориентированного конструирования Ч. Хоара определение списка можно записать следующим образом:

List(A) = NIL + (A \times List(A))prefix = \text<constructor> List(A)head, tail = \text<selectors> List(A)null, nonnull = \text<predicates> List(A)NIL, nonNIL = \text<parts> List(A)

Первая строка данного определения обозначает, что список элементов типа A(говорят: «список над A») представляет собой размеченное объединение пустого списка и декартова произведения атома типа Aсо списком над A. Для создания списков используются два конструктора (вторая строка определения), первый из которых создаёт пустой список, а второй — непустой соответственно. Вполне понятно, что второй конструктор получает на вход в качестве параметров некоторый атом и список, а возвращает список, первым элементом которого является исходный атом, а остальными — элементы исходного списка. То есть получается префиксация атома к списку, с чем и связано такое наименование конструктора. Здесь необходимо отметить, что пустой список []не является атомом, а потому не может префиксироваться. С другой стороны, пустой список является как бы нулевым элементом для конструирования списков, поэтому любой список содержит в самом своём конце именно пустой список — с него начинается конструирование.

Третья строка определяет селекторы для списка, то есть операции для доступа к элементам внутри списка. Селектор headполучает на вход список и возвращает первый элемент этого списка, то есть типом результата является тип A. Этот селектор не может получить на вход пустой список — в этом случае результат операции неопределён. Селектор tailвозвращает список, полученный из входного в результате отсечения его головы (первого элемента). Этот селектор также не может принимать на вход пустой список, так как в этом случае результат операции неопределён. При помощи этих двух операций можно достать из списка любой элемент. Например, чтобы получить третий элемент списка (если он имеется), необходимо последовательно два раза применить селектор tail, после чего применить селектор head. Другими словами, для получения элемента списка, который находится на позиции n(начиная с 0для первого элемента, как это принято в программировании), необходимо nраз применить селектор tail, после чего применить селектор head.

true

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

Свойства

У определённой таким образом структуры данных имеются некоторые свойства:

A

  • Размер списка — количество элементов в нём, исключая последний «нулевой» элемент, являющийся по определению пустым списком.
  • Тип элементов — тот самый тип , над которым строится список; все элементы в списке должны быть этого типа.
  • Отсортированность — список может быть отсортирован в соответствии с некоторыми критериями сортировки (например, по возрастанию целочисленных значений, если список состоит из целых чисел).
  • Возможности доступа — некоторые списки в зависимости от реализации могут обеспечивать программиста селекторами для доступа непосредственно к заданному по номеру элементу.
  • Сравниваемость — списки можно сравнивать друг с другом на соответствие, причём в зависимости от реализации операция сравнения списков может использовать разные технологии.

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

Списки в языках программирования

Функциональные языки

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *