Учебники

Q Language — Индексирование

Список упорядочен слева направо по позиции его элементов. Смещение элемента от начала списка называется его индексом . Таким образом, первый элемент имеет индекс 0, второй элемент (если таковой имеется) имеет индекс 1 и т. Д. Список с номером n имеет индексную область от 0 до n – 1 .

Индексная нотация

Имея список L , элемент с индексом i доступен через L [i] . Получение элемента по его индексу называется индексацией элемента . Например,

q)L:(99;98.7e;`b;`abc;"z")

q)L[0]
99

q)L[1]
98.7e

q)L[4]
"z

Индексированное назначение

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

q)L1:9 8 7

q)L1[2]:66      / Indexed assignment into a simple list
                / enforces strict type matching.
                
q)L1
9 8 66

Списки из переменных

q)l1:(9;8;40;200)

q)l2:(1 4 3; `abc`xyz)

q)l:(l1;l2)               / combining the two list l1 and l2

q)l
9 8 40 200
(1 4 3;`abc`xyz)

Присоединяющиеся списки

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

q)1,2 3 4
1 2 3 4

q)1 2 3, 4.4 5.6     / If the arguments are not of uniform type,
                     / the result is a general list.
1
2
3
4.4
5.6

гнездование

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

глубина

Количество уровней вложенности для списка называется его глубиной. Атомы имеют глубину 0, а простые списки имеют глубину 1.

q)l1:(9;8;(99;88))

q)count l1
3

Вот список глубины 3 с двумя пунктами:

q)l5
9
(90;180;900 1800 2700 3600)

q)count l5
2

q)count l5[1]
3

Индексирование по глубине

Можно индексировать непосредственно в элементы вложенного списка.

Повторное индексирование предметов

Извлечение элемента по одному индексу всегда приводит к получению самого верхнего элемента из вложенного списка.

q)L:(1;(100;200;(300;400;500;600)))

q)L[0]
1

q)L[1]
100
200
300 400 500 600

Поскольку результат L [1] сам по себе является списком, мы можем извлечь его элементы, используя один индекс.

q)L[1][2]
300 400 500 600

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

q)L[1][2][0]
300

Вы можете прочитать это как,

Получить элемент по индексу 1 из L и извлечь из него элемент по индексу 2, а из него получить элемент по индексу 0.

Обозначение для индексации на глубине

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

q)L[1;2;0]
300

Назначение через индекс также работает на глубине.

q)L[1;2;1]:900

q)L
1
(100;200;300 900 500 600)

Элидируемые индексы

Исключение индексов для общего списка

q)L:((1 2 3; 4 5 6 7); (`a`b`c;`d`e`f`g;`0`1`2);("good";"morning"))

q)L
(1 2 3;4 5 6 7)
(`a`b`c;`d`e`f`g;`0`1`2)
("good";"morning")

q)L[;1;]
4 5 6 7
`d`e`f`g
"morning"

q)L[;;2]
3 6
`c`f`2
"or"

Интерпретировать L [; 1;] как,

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

Интерпретировать L [;; 2] как,

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