Последовательность — это абстрактный тип данных в LISP. Векторы и списки являются двумя конкретными подтипами этого типа данных. Все функциональные возможности, определенные для типа данных последовательности, фактически применяются ко всем векторам и типам списков.
В этом разделе мы обсудим наиболее часто используемые функции на последовательностях.
Прежде чем приступить к различным способам манипулирования последовательностями (например, векторами и списками), давайте посмотрим на список всех доступных функций.
Создание последовательности
Функция make-sequence позволяет создавать последовательности любого типа. Синтаксис этой функции —
make-sequence sqtype sqsize &key :initial-element
Он создает последовательность типа sqtype и длины sqsize.
При желании вы можете указать какое-либо значение с помощью аргумента : initial-element , тогда каждый из элементов будет инициализирован этим значением.
Например, создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(write (make-sequence '(vector float) 10 :initial-element 1.0))
Когда вы выполняете код, он возвращает следующий результат —
#(1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0)
Общие функции на последовательностях
Sr.No. | Описание функции |
---|---|
1 |
еи Это позволяет получить доступ к отдельным элементам через целочисленный индекс. |
2 |
длина Возвращает длину последовательности. |
3 |
после- Он возвращает подпоследовательность путем извлечения подпоследовательности, начинающейся с определенного индекса и продолжающейся до определенного конечного индекса или конца последовательности. |
4 |
Копия-сл Он возвращает последовательность, которая содержит те же элементы, что и ее аргумент. |
5 |
заполнить Он используется для установки нескольких элементов последовательности на одно значение. |
6 |
замещать Он принимает две последовательности, и первая последовательность аргументов деструктивно модифицируется путем копирования в нее последовательных элементов из второй последовательности аргументов. |
7 |
подсчитывать Он берет элемент и последовательность и возвращает количество раз, когда элемент появляется в последовательности. |
8 |
задний ход Возвращает последовательность, содержащую те же элементы аргумента, но в обратном порядке. |
9 |
nreverse Возвращает ту же последовательность, содержащую те же элементы, что и последовательность, но в обратном порядке. |
10 |
сцеплять Он создает новую последовательность, содержащую конкатенацию любого количества последовательностей. |
11 |
позиция Он принимает элемент и последовательность и возвращает индекс элемента в последовательности или ноль. |
12 |
находить Требуется предмет и последовательность. Он находит элемент в последовательности и возвращает его, если не найден, то возвращает ноль. |
13 |
Сортировать Он принимает последовательность и предикат с двумя аргументами и возвращает отсортированную версию последовательности. |
14 |
сливаться Он принимает две последовательности и предикат и возвращает последовательность, созданную путем слияния двух последовательностей в соответствии с предикатом. |
15 |
карта Он принимает функцию с n аргументами и n последовательностей и возвращает новую последовательность, содержащую результат применения функции к последующим элементам последовательностей. |
16 |
немного Он принимает предикат в качестве аргумента и выполняет итерацию по последовательности аргументов и возвращает первое не-NIL-значение, возвращаемое предикатом, или возвращает false, если предикат никогда не выполняется. |
17 |
каждый Он принимает предикат в качестве аргумента и перебирает последовательность аргументов, он завершается, возвращая ложь, как только предикат терпит неудачу. Если предикат всегда выполняется, он возвращает истину. |
18 |
notany Он принимает предикат в качестве аргумента и выполняет итерацию по последовательности аргументов и возвращает ложь, как только предикат удовлетворен, или истина, если он никогда не выполняется. |
19 |
не каждый Он принимает предикат в качестве аргумента и выполняет итерацию по последовательности аргументов и возвращает истину, как только предикат завершается ошибкой, или ложь, если предикат всегда выполняется. |
20 |
уменьшить Он сопоставляет одну последовательность, применяя функцию с двумя аргументами сначала к первым двум элементам последовательности, а затем к значению, возвращаемому функцией и последующими элементами последовательности. |
21 |
поиск Он ищет последовательность, чтобы найти один или несколько элементов, удовлетворяющих некоторому критерию. |
22 |
Удалить Он принимает элемент и последовательность и возвращает последовательность с удаленными экземплярами элемента. |
23 |
удалять Это также берет элемент и последовательность и возвращает последовательность того же вида, что и последовательность аргументов, которая имеет те же элементы, кроме элемента. |
24 |
замена Он принимает новый элемент, существующий элемент и последовательность и возвращает последовательность с экземплярами существующего элемента, замененными новым элементом. |
25 |
nsubstitute Он принимает новый элемент, существующий элемент и последовательность и возвращает ту же последовательность с экземплярами существующего элемента, замененными новым элементом. |
26 |
несоответствие Он принимает две последовательности и возвращает индекс первой пары несовпадающих элементов. |
еи
Это позволяет получить доступ к отдельным элементам через целочисленный индекс.
длина
Возвращает длину последовательности.
после-
Он возвращает подпоследовательность путем извлечения подпоследовательности, начинающейся с определенного индекса и продолжающейся до определенного конечного индекса или конца последовательности.
Копия-сл
Он возвращает последовательность, которая содержит те же элементы, что и ее аргумент.
заполнить
Он используется для установки нескольких элементов последовательности на одно значение.
замещать
Он принимает две последовательности, и первая последовательность аргументов деструктивно модифицируется путем копирования в нее последовательных элементов из второй последовательности аргументов.
подсчитывать
Он берет элемент и последовательность и возвращает количество раз, когда элемент появляется в последовательности.
задний ход
Возвращает последовательность, содержащую те же элементы аргумента, но в обратном порядке.
nreverse
Возвращает ту же последовательность, содержащую те же элементы, что и последовательность, но в обратном порядке.
сцеплять
Он создает новую последовательность, содержащую конкатенацию любого количества последовательностей.
позиция
Он принимает элемент и последовательность и возвращает индекс элемента в последовательности или ноль.
находить
Требуется предмет и последовательность. Он находит элемент в последовательности и возвращает его, если не найден, то возвращает ноль.
Сортировать
Он принимает последовательность и предикат с двумя аргументами и возвращает отсортированную версию последовательности.
сливаться
Он принимает две последовательности и предикат и возвращает последовательность, созданную путем слияния двух последовательностей в соответствии с предикатом.
карта
Он принимает функцию с n аргументами и n последовательностей и возвращает новую последовательность, содержащую результат применения функции к последующим элементам последовательностей.
немного
Он принимает предикат в качестве аргумента и выполняет итерацию по последовательности аргументов и возвращает первое не-NIL-значение, возвращаемое предикатом, или возвращает false, если предикат никогда не выполняется.
каждый
Он принимает предикат в качестве аргумента и перебирает последовательность аргументов, он завершается, возвращая ложь, как только предикат терпит неудачу. Если предикат всегда выполняется, он возвращает истину.
notany
Он принимает предикат в качестве аргумента и выполняет итерацию по последовательности аргументов и возвращает ложь, как только предикат удовлетворен, или истина, если он никогда не выполняется.
не каждый
Он принимает предикат в качестве аргумента и выполняет итерацию по последовательности аргументов и возвращает истину, как только предикат завершается ошибкой, или ложь, если предикат всегда выполняется.
уменьшить
Он сопоставляет одну последовательность, применяя функцию с двумя аргументами сначала к первым двум элементам последовательности, а затем к значению, возвращаемому функцией и последующими элементами последовательности.
поиск
Он ищет последовательность, чтобы найти один или несколько элементов, удовлетворяющих некоторому критерию.
Удалить
Он принимает элемент и последовательность и возвращает последовательность с удаленными экземплярами элемента.
удалять
Это также берет элемент и последовательность и возвращает последовательность того же вида, что и последовательность аргументов, которая имеет те же элементы, кроме элемента.
замена
Он принимает новый элемент, существующий элемент и последовательность и возвращает последовательность с экземплярами существующего элемента, замененными новым элементом.
nsubstitute
Он принимает новый элемент, существующий элемент и последовательность и возвращает ту же последовательность с экземплярами существующего элемента, замененными новым элементом.
несоответствие
Он принимает две последовательности и возвращает индекс первой пары несовпадающих элементов.
Аргументы ключевых слов стандартной последовательности функций
аргументация | Имея в виду | Значение по умолчанию |
---|---|---|
:тестовое задание | Это функция с двумя аргументами, используемая для сравнения элемента (или значения, извлеченного функцией key) с элементом. | EQL |
: ключ | Функция с одним аргументом для извлечения значения ключа из фактического элемента последовательности. NIL означает использовать элемент как есть. | NIL |
:Начните | Начальный индекс (включительно) подпоследовательности. | 0 |
:конец | Конечный индекс (исключающий) подпоследовательности. NIL указывает на конец последовательности. | NIL |
: От конца | Если true, последовательность будет проходить в обратном порядке, от конца к началу. | NIL |
: граф | Число, указывающее количество элементов, которые необходимо удалить или заменить, или NIL, чтобы указать все (только УДАЛИТЬ и ЗАМЕНИТЬ). | NIL |
Мы только что обсудили различные функции и ключевые слова, которые используются в качестве аргументов в этих функциях, работающих с последовательностями. В следующих разделах мы увидим, как использовать эти функции на примерах.
Найти длину и элемент
Функция length возвращает длину последовательности, а функция elt позволяет получить доступ к отдельным элементам с помощью целочисленного индекса.
пример
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(setq x (vector 'a 'b 'c 'd 'e)) (write (length x)) (terpri) (write (elt x 3))
Когда вы выполняете код, он возвращает следующий результат —
5 D
Изменение последовательности
Некоторые функции последовательности позволяют выполнять итерацию по последовательности и выполнять некоторые операции, такие как поиск, удаление, подсчет или фильтрация определенных элементов без написания явных циклов.
Следующий пример демонстрирует это —
Пример 1
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(write (count 7 '(1 5 6 7 8 9 2 7 3 4 5))) (terpri) (write (remove 5 '(1 5 6 7 8 9 2 7 3 4 5))) (terpri) (write (delete 5 '(1 5 6 7 8 9 2 7 3 4 5))) (terpri) (write (substitute 10 7 '(1 5 6 7 8 9 2 7 3 4 5))) (terpri) (write (find 7 '(1 5 6 7 8 9 2 7 3 4 5))) (terpri) (write (position 5 '(1 5 6 7 8 9 2 7 3 4 5)))
Когда вы выполняете код, он возвращает следующий результат —
2 (1 6 7 8 9 2 7 3 4) (1 6 7 8 9 2 7 3 4) (1 5 6 10 8 9 2 10 3 4 5) 7 1
Пример 2
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(write (delete-if #'oddp '(1 5 6 7 8 9 2 7 3 4 5))) (terpri) (write (delete-if #'evenp '(1 5 6 7 8 9 2 7 3 4 5))) (terpri) (write (remove-if #'evenp '(1 5 6 7 8 9 2 7 3 4 5) :count 1 :from-end t)) (terpri) (setq x (vector 'a 'b 'c 'd 'e 'f 'g)) (fill x 'p :start 1 :end 4) (write x)
Когда вы выполняете код, он возвращает следующий результат —
(6 8 2 4) (1 5 7 9 7 3 5) (1 5 6 7 8 9 2 7 3 5) #(A P P P E F G)
Сортировка и объединение последовательностей
Функции сортировки принимают последовательность и предикат с двумя аргументами и возвращают отсортированную версию последовательности.
Пример 1
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(write (sort '(2 4 7 3 9 1 5 4 6 3 8) #'<)) (terpri) (write (sort '(2 4 7 3 9 1 5 4 6 3 8) #'>)) (terpri)
Когда вы выполняете код, он возвращает следующий результат —
(1 2 3 3 4 4 5 6 7 8 9) (9 8 7 6 5 4 4 3 3 2 1)
Пример 2
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(write (merge 'vector #(1 3 5) #(2 4 6) #'<)) (terpri) (write (merge 'list #(1 3 5) #(2 4 6) #'<)) (terpri)
Когда вы выполняете код, он возвращает следующий результат —
#(1 2 3 4 5 6) (1 2 3 4 5 6)
Предикаты последовательности
Функции every, some, notany и notevery называются предикатами последовательности.
Эти функции перебирают последовательности и проверяют логический предикат.
Все эти функции принимают предикат в качестве первого аргумента, а остальные аргументы являются последовательностями.
пример
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(write (every #'evenp #(2 4 6 8 10))) (terpri) (write (some #'evenp #(2 4 6 8 10 13 14))) (terpri) (write (every #'evenp #(2 4 6 8 10 13 14))) (terpri) (write (notany #'evenp #(2 4 6 8 10))) (terpri) (write (notevery #'evenp #(2 4 6 8 10 13 14))) (terpri)
Когда вы выполняете код, он возвращает следующий результат —
T T NIL NIL T
Последовательности картирования
Мы уже обсуждали функции отображения. Точно так же функция map позволяет применять функцию к последующим элементам одной или нескольких последовательностей.
Функция map принимает функцию с n аргументами и n последовательностей и возвращает новую последовательность после применения функции к последующим элементам последовательностей.
пример
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(write (map 'vector #'* #(2 3 4 5) #(3 5 4 8)))
Когда вы выполняете код, он возвращает следующий результат —