Опубликован: 03.12.2012 | Доступ: свободный | Студентов: 1102 / 247 | Длительность: 16:43:00
Лекция 4:

Работа со списками

< Лекция 3 || Лекция 4: 123456 || Лекция 5 >

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

При помощи функции Part[list,n] можно извлечь из списка list элемент, зная его позицию n в списке. Эту функцию также можно задать в сокращённом виде, используя двойные скобки: list[[n]]. Чтобы обратиться сразу к нескольким элементам списка, следует задать функцию в виде Part[list,{n1,n2,...}] или list[[{n1,n2,...}]], где n1,n2,... — номера элементов, которые требуется извлечь.

В примере In[1] на рис. 3.11 мы задали одноуровневый список list, в In[2] при помощи полной формы функции Part мы извлекли второй элемент списка list, а в In[3], — используя сокращённую форму, третий и пятый элементы.

Извлечение элементов линейных списков

Рис. 3.11. Извлечение элементов линейных списков

Для того чтобы извлечь элемент из вложенного списка, необходимо указать и номер подсписка, в котором находится необходимый элемент, и номер элемента в этом подсписке. На рис. 3.12 приведён пример извлечения элементов матрицы 3х3. В примере In[2] мы извлекаем элемент с номером 2 из третьего подсписка. В примере In[3] мы полностью извлекаем второй столбец матрицы, заменив номер подсписка на выражение All, а в примере In[4] — третью строку, которая также является третьим подсписком исходного списка, причём мы можем либо заменить номер элемента на All, либо вовсе опустить этот параметр.

Извлечение элементов вложенных списков

Рис. 3.12. Извлечение элементов вложенных списков

Для обращения к элементам списка в Mathematica имеется ещё одна функция — с заголовком Take. В своей простейшей форме Take[list,{b1,b2}] она возвращает фрагмент списка list, содержащий элементы с номерами от b1 до b2, причём если b1, b2 принимают положительные значения, то номер элемента отсчитывается от первого (пример In[1] на рис. 3.13), а если отрицательные — от последнего (пример In[2]). При этом b1 и b2 могут принимать положительные и отрицательные значения независимо друг от друга (пример In[3]).

Если функция задаётся в виде Take[list,b], при положительном b возвращается фрагмент списка, начиная от элемента с номером 1 до элемента с номером b, а при отрицательном b — от элемента с номером абсолютного значения b с конца списка до последнего элемента в списке (примеры In[4] и In[5] на рис. 3.13).

В наиболее полной форме Take[list,{b1,b2,di}] функция из списка list выбирает каждый di-й элемент, начиная с элемента под номером b1 и заканчивая элементом с номером, не большим, чем b2 (пример In[6] на рис. 3.13).

Подробней об управлении содержанием списка см. книги Е. М. Воробьёва [1, с. 105–106] и П. Веллина и др. [14, с. 62–63].

Использование функции Take для извлечения фрагментов списков

Рис. 3.13. Использование функции Take для извлечения фрагментов списков

3.4. Преобразование списков

Mathematica позволяет отбрасывать фрагменты списка при помощи функции Drop[list,bound], где bound задаёт фрагмент списка list, который необходимо отбросить. Правила задания функции Drop такие же, как и для Take. Примеры отбрасывания элементов в начале, конце и в произвольном месте списка представлены на рис. 3.14 как In[1], In[2] и In[3], соответственно.

Помимо отбрасывания целых фрагментов Mathematica позволяет селективно удалять элементы списка с определёнными номерами при помощи функции Delete[list,{{n1},{n2},...}], где n1,n2,...— номера элементов списка list, которые необходимо удалить — примеры In[4] и In[5] на рис. 3.14.

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

Рис. 3.14. Удаление элементов списка

Mathematica позволяет добавлять в списки новые элементы. Для добавления элементов в начало и конец списка имеются соответствующие функции: Prepend[list,n] и Append[list,elem] (см. примеры In[1] и In[2] на рис. 3.15).

Функция Insert[list,elem,n] помещает выражение elem на позицию n в списке list, причём число n может принимать как положительные, так и отрицательные значения (пример In[3] на рис. 3.15).

Как мы уже отмечали, элементами списка могут быть любые выражения, в том числе и списки. Новый элемент elem можно вставить в любой внутренний список в списке list или внутрь любого элемента списка, если этот элемент не является атомарным выражением. В примере In[4] на рис. 3.15 указание позиции в виде {1,2} означает, что новый элемент нужно вставить в первый элемент списка на вторую позицию. Один и тот же элемент можно вставить на несколько позиций — см. пример In[5].

Mathematica позволяет осуществлять суперпозицию описанных выше функций удаления и добавления элементов в список — заменять один элемент другим. Делается это при помощи функции ReplaceRart[list,elem,n], которая заменяет элемент списка list под номером n элементом elem — см. пример In[6] на рис. 3.15.

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

Рис. 3.15. Добавление элементов в список

Элементы списка можно отсортировать в каноническом порядке, принятом в Mathematica, при помощи функции Sort[list]. Автоматически Mathematica производит сортировку списков следующим образом: целые, рациональные и вещественные числа сортируются по возрастанию значения, комплексные — по возрастанию значения действительной части, а при равных её значениях — по абсолютной величине мнимой части; символы и строки сортируются по алфавиту, степени и произведения сортируются так же, как и члены в полиноме, по возрастанию степени; в списках, содержащих смешанные данные (числа, символы строки), сначала сортируются численные данные, а за ними — "буквенные", т.е., символы и строки. Примеры In[1] и In[2] канонической сортировки см. на рис. 3.16.

Функция Sort[list,cond] позволяет отсортировать список в порядке, заданном пользователем, при чём cond — условие, по которому будет происходить сортировка. Например, если эту функцию мы применим к списку чисел list с условием cond равным Greater, то список будет сортирован по убыванию. Условие Greater можно записать в следующем виде: #1>#2&. Подобная конструкция, как мы уже знаем, является анонимной функцией. Пример сортировки по заданному пользователем критерию In[3] и In[4] см. на рис. 3.16. Изменить направление сортировки можно также при помощи функции Reverse[list] — пример In[5].

Если мы попробуем автоматически отсортировать вложенный список, то упорядочение будет вестись по первому элементу каждого внутреннего списка, а списки с большим числом элементов будут располагаться после списков с меньшим числом — см. пример In[6] на рис. 3.16.

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

Рис. 3.16. Сортировка элементов списка

В Mathematica имеются функции, позволяющие циклически переставлять элементы списков справа налево RotateLeft[list,n] и слева направо RotateRight[list,n], где n определяет число позиций, на которое следует сдвинуть элементы списка list в ту или иную сторону. Если параметр n опущен, то перестановка осуществляется на одну позицию. Примеры использования функций перемещения см. на рис. 3.17.

Циклическая перестановка элементов списка

Рис. 3.17. Циклическая перестановка элементов списка

Mathematica позволяет из линейных списков создавать вложенные списки. При помощи функции Partition[list,n] линейный список list преобразуется во вложенный список, причём внутренние списки не перекрываются и содержат по n элементов (см. пример In[1] на рис. 3.18). Для создания перекрывающихся списков используется функция в виде Partition[list,n,w], по выполнении которой генерируется вложенный список, содержащий n внутренних списков, причём w последних элементов предыдущего списка становятся w первыми элементами последующего списка (пример In[2]).

Создание вложенных списков на основе линейных

Рис. 3.18. Создание вложенных списков на основе линейных

Возможна в программе и обратная операция — объединение элементов вложенного списка в один линейный список. Так функция Flatten[list], где list — вложенный список, убирает заголовок List у всех внутренних списков и превращает list в одноуровневый список. Заданная в более полном виде функция Flatten[list,n] убирает заголовок List только до уровня n включительно, т.е., список, полученный в результате выполнения этой функции, может быть и не одноуровневым. Соответствующие примеры см. на рис. 3.19.

Создание более низкоуровневых списков из вложенных списков

Рис. 3.19. Создание более низкоуровневых списков из вложенных списков

Обратимся теперь к функциям, которые рассматривают список скорее как множество, а не как упорядоченную структуру.

Простейшей для понимания из них является функция Join[list1,list2,...], осуществляющая сцепление (конкатенацию) списков независимо от содержащихся в них элементов (пример In[1] на рис. 3.20). Вообще говоря, в списке могут содержаться совпадающие элементы. Применение к нему функции Union[list] приводит к удалению повторений элементов и к сортировке оставшихся. Если аргумент этой функции будет содержать несколько списков, то результатом будет список, состоящий из элементов этих списков, причём повторяющиеся элементы также будут удалены.

Функция Intersection[list1,list2,...] возвращает список элементов списка list, содержащихся в списках list1, list2..., а Complement[list1,list2,...] — НЕ содержащихся в списках. Повторные элементы в результирующих списках также будут удалены. Примеры работы с повторяющимися элементами списков также см. на рис. 3.20.

Подробней о преобразовании списков см. книги Е. М. Воробьёва [1, с. 103–110] и П. Веллина и др. [14, с. 63–66, 69].

Операции с несколькими списками

Рис. 3.20. Операции с несколькими списками
< Лекция 3 || Лекция 4: 123456 || Лекция 5 >