Q for Mortals2笔记 -- 列表
列表的介绍
- 列表可以只包含原子类型,也可以包含其他列表
- 列表可以只包含一种类型的元素(叫简单列表),例如只包含int类型的列表;也可以包含不同类型的元素(叫通用列表)
- 列表的定义:用一队小括号包围,用分号分隔组成元素,如(1;2;3),简单列表可以有其他表示方式,请参考下文
- count可用于得到列表的元素数目
- 列表是有序的
简单列表
整数列表
整数列表的表示方法
- (100;200;300),使用默认数据类型
- 100 200 300,使用默认数据类型
- (1h;2h;255h),使用指定数据类型
- 1 2 255h,使用指定数据类型,注意它不等于(1;2;255h),后者是一个通用列表
q)type 1 2 255h 5h q)type (1;2;255h) 0h
浮点数列表
表示方法与整数列表类似。注意包含浮点数和整数的列表会被转换成浮点数列表,从而不是一个通用列表,例如
q)(1 2.0 3)~(1 2 3f) 1b q)type 1 2.0 3 9h
二进制数据列表
01011b等同于(0b;1b;0b;1b;1b),0x20a1ff等同于(0x20;0xa1;0xff)。
Symbol列表
`abc`def`ghi等同于(`abc;`def;`ghi),如果某个元素包含`或者空格,则不能采用前一种表示方法,如(`abc;`$"`def";`$"g h i")。
字符列表(字符串)
"abc def"等同于("a";"b";"c";" ";"d";"e";"f")。
时间数据列表
文中所说的混合类型的时间数据列表会被转换成第一个元素的类型,我测试后并不是这样,不知道是不是由于版本的差异
空列表和单元素列表
通用的空列表
()表示通用的空列表,我们也可以建立指定类型的空列表,后面章节会提到。
单元素列表
创建单元素列表不能使用(),(<元素>)仍然是该元素自身,必须用enlist <元素>来表示一个单元素列表
q)type (42) -7h q)type enlist 42 7h
如果enlist加在一个列表前,它仍然是一个单元素列表,只不过元素是一个列表
q)type enlist 1 2 3 0h q)type 1 2 3 7h
列表下标
跟Java数组类似,q用[]表示下标,下标从0开始。列表元素的取得和赋值都可以通过下标进行。要注意的是,对简单列表进行下标赋值的时候必须使用同类型的数据,否则报type错误。kdb不会做任何的类型变更(例如把short转换成int之类的变更)。
取值的时候下标越界的话会返回一个空值而非错误。
不加任何下标的时候返回的是整个列表。双冒号::表示空元素,用它作下标返回的也是整个列表。用空列表作下班时返回的是一个空列表
q)L: 100 200 300 q)L[] 100 200 300 q)L[::] 100 200 300 q)L[()] q)type L[()] 0h
注意,空元素(::)的类型是未定义的,所以包含空元素的所有列表的类型都是通用类型,可以利用这个特性将列表强制定义为通用类型
q)L: (1;2;3;::) q)type L 0h q)L 1 2 3 ::
,或者避免在下标赋值的时候KDB将一个通用列表自动转换成简单列表
q)L: (1;2;3;`a;::) q)type L 0h q)L[3]:4 q)L 1 2 3 4 :: q)type L 0h q)L[3]:`a
连接列表
使用逗号可以连接多个列表成为一个。注意,如果是其中有单元素列表而且不是最后一个列表,需要将其用小括号包围起来
q)type "ab","cd","ef" 10h q)type "ab","cde",enlist "f" 10h q)type "ab",enlist "c","def" 0h q)type enlist "a","bc","def" 0h q)type "ab",(enlist "c"),"def" 10h q)type (enlist "a"),"bc","def" 10h
原因是q是从右向左执行表达式的,例如enlist "a","bc"是先执行"a","bc",然后再enlist
q)count enlist "a","bc" 1
以Map的形式操作List
如果把下标当做key,那么我们可以把列表当做Map。
嵌套
列表里面包含其他列表作为子元素。
深度
列表嵌套的层数称之为深度,原子类型的深度是0,简单列表的深度是1。
多维下标
有两种方法
- 类似Java多维数组,L[i1][i2][i3]...
- L[i1; i2; i3...]
使用列表作为下标
一个索引列表可以作为下标来访问一个列表来返回一个列表或者赋值
- 可以是任意顺序,例如L[3 2 0 1]
- 可以重复,例如[0 2 0]
- 不仅是简单列表,通用列表一样可以作为下标。通用列表本身的结构决定了返回值的结构,例如L[(0 1; 2 3)]相当于(L[0] L[1]; L[2] L[3])
- 下标列表可以用于赋值,如L[1 2 3]: 100 200 300,要注意的是执行顺序是从左到右,如果有重复的索引,则最终的值是最右边的那个,例如L[0 1 0]: 100 200 300,L[0]最终是300
- 赋值的时候可以只使用一个值,如L[1 3]: 999,L[1]和L[3]都会赋值为999
- 使用下标列表时也可以不用[],直接用空格分隔目标列表和索引列表即可,如L 2 1等同于L[2 1],具体使用哪种方式是个人喜好问题
查找(?)
?可以用于查找指定值或者值列表在列表中的索引
- 如果可以找到,返回该值的索引
q)1001 1002 1003?1002 1
- 如果找不到,返回该列表的长度
q)1001 1002 1003?1004 3
- 值列表
q)1001 1002 1003?1003 1004 2 3
省略的下标
矩阵列表
q)m:(((1 2 3);(2 3 4));((-1 -2 -3);(-2 -3 -4))) q)m 1 2 3 2 3 4 -1 -2 -3 -2 -3 -4 q)m[1] -1 -2 -3 -2 -3 -4 q)m[0] 1 2 3 2 3 4 q)m[0][1] 2 3 4 q)m[0][0][0] 1 q)m[1;] -1 -2 -3 -2 -3 -4 q)m[1;0] -1 -2 -3 q)m[1;0;] -1 -2 -3 q)m[1;;0] -1 -2 q)m[;;1] 2 3 -2 -3 q)m[;1] 2 3 4 -2 -3 -4
我觉得可以把m[1;]理解为m[1 *],m[;;1]理解为m[* * 1]。
通用列表
通用列表不能保证同层次的子元素都是长度一致的列表,因此使用省略的下标时,如果下标越界的话对应的值会是null,例如下面is只有2个字符,取下标2时返回" "(空char)
q)L:((1 2 3;4 5 6 7);(`a`b`c`d;`z`y`x`;`0`1`2);("now";"is";"the")) q)L[;;2] 3 6 `c`x`2 "w e"
注意,下标可以越界,深度不能越界
q)L:((1 2 3;4 5 6 7);(`a`b`c`d;`z`y`x`;`0`1`2);("now";"is";"the")) q)L[;;10] 0N 0N ``` " " q)L[;;;4] 'type
省略的下标还可以和下标列表一起使用
q)L:((1 2 3;4 5 6 7);(`a`b`c`d;`z`y`x`;`0`1`2);("now";"is";"the")) q)L[0 2;;0 1] (1 2;4 5) ("no";"is";"th")
矩形列表和矩阵
矩形列表
矩形列表是列表的列表。顶层的子元素的长度相同,第二层的不保证相同。矩形列表可以理解为一个表,顶层的各个元素代表行,第二层的各个元素代表列。省略第二层的下标时相当于按行取数据,省略第一次的下标时相当于按列取数据。flip可以用于切换行和列
q)L:(1 2 3; (10 20; 100 200; 1000 2000)) q)L 1 2 3 10 20 100 200 1000 2000 q)L[0;] 1 2 3 q)L[;0] 1 10 20 q)flip L 1 10 20 2 100 200 3 1000 2000
矩阵
矩阵是一种特殊的矩形列表。矩阵可以递归定义。一维矩阵是简单列表,二维矩阵由相同大小的一维矩阵组成,以此类推,n维矩阵由相同大小的n-1维矩阵组成。
二维矩阵的每行都是一个简单列表,存储在连续的空间,因此读取整行非常快;但是读取一列就比较慢了。这种行列的定义是传统的矩阵的表示方法,当然我们也可以切换行列,将一维矩阵视为列,这样读取列就快多了,坏处是跟传统的矩阵的表示方法不一致,会引起混乱?KDB的表实际上是列的集合,q-sql的约束和计算都是基于列的从而非常快,比关系型数据库(按无序的行存储数据)快出几个数量级。
Q for Mortals2笔记 -- 列表相关推荐
- Q for Mortals2笔记 -- 概述
Q for Mortals2地址: http://code.kx.com/wiki/JB:QforMortals2/contents q的演变 q的设计目标是可表达性,速度和效率,这些方面达到了预期的 ...
- Q for Mortals2笔记 -- 字典
概述 字典衍生于列表,是表的基础. 字典的基础 字典是一个键值对的有序集合,即其他语言中的哈希表. 定义 字典的定义用!,左边是键,右边是值.可以用key来取得字典的键列表,value来取得字典的值列 ...
- Q for Mortals2笔记 -- 基本操作
函数的介绍 调用函数的时候用[]来分隔函数名和参数,在参数列表中用;分隔各参数,如f[x;y].操作符实际上也是函数,只不过函数通常写法是函数名+参数,而操作符是介于操作数中间. Verb:二元操作符 ...
- Q for Mortals2笔记 -- 函数
函数规范 q不是纯粹的函数式语言,因为q函数可以访问全局变量. 函数定义 函数体用{}包围,[]用于输入参数列表,分号(;)用于分隔各行代码和参数列表,输入参数和返回值不指定类型.调用时参数列表也是用 ...
- Q for Mortals2笔记 -- 造型和枚举
类型和造型 基本类型 即原子类型 类型 可以用type来查看任意q实体的类型(用short数值类型表示),原子数的返回值都是负数,简单列表的返回值是正数(原子数的类型值跟其简单列表的类型值一样,只是正 ...
- Q for Mortals2笔记 -- 原子数据类型
概览 参照该文里的两个表格来了解Q的数据类型.其中: type:类型名称 size:该类型占用多少个字节 char type:该类型的单字符代号,可以跟在值后面表示类型,例如1b表示boolean的t ...
- python编程入门到实践笔记习题_Python编程从入门到实践笔记——列表简介
python编程从入门到实践笔记--列表简介 #coding=utf-8 #列表--我的理解等于c语言和java中的数组 bicycles = ["trek","cann ...
- Python 学习笔记 列表 range() xxx XXX
Python 学习笔记 列表 range() xxx XXX print("-" * 30) for value in range(1, 5):print(value)number ...
- Python 学习笔记 列表 xxx XXX
Python 学习笔记 列表 xxx XXX bicycles = ['trek', 'cannondale', 'redline', 'specialized'] print(bicycles) p ...
最新文章
- 程序员请收好:10个非常有用的 Visual Studio Code 插件!
- 为什么 Linux 需要虚拟内存
- Apache Rewrite url重定向功能的简单配置
- Uvalive 3523 - Knights of the Round Table (双连通分量+二分图)
- Go 语言编程 — go mod 依赖包管理
- 网络推广专员如何稳定搜索引擎首页排名全力以赴致力于网络推广
- 牛客 - 树上子链(树的直径-处理负权)
- Docker监控方案(TIG)的研究与实践之Influxdb
- 基金委通报科研诚信违规违纪案件查处情况
- plink源码_plink: 等位型计数(allele count)
- memcache 防火墙策略
- linux复制后权限变了,linux系统(centos debian freebsd等)如何拷贝数据并保持原来的属性(权限 属主)不变?...
- (活动)MySQL DBA之路 | 性能配置调优篇
- 不要再被Python洗脑了!!
- JetBrains IDEs
- Java创建Zip文件示例
- 清理C盘空间,给Win7释放更多C盘容量
- CentOS8.3部署GlusterFS
- windows update 离线包下载
- Python基于OpenCV的工作疲劳检测系统[源码&UI界面&部署教程]
热门文章
- 老鼠,找毒酒,二进制算法
- 《Windows内核安全与驱动编程》-第五章阻塞、等待与安全设计
- mysql 实现yyyyww_wwyyyy
- 经验总结 | 如何使用服务器上传下载文件
- 转:为什么越来越多企业放弃做KPI考核?百度李彦宏:KPI曾让百度迷失
- ssm基于Android的签到系统APP(ssm+uinapp+Mysql)-计算机毕业设计
- 安卓学习之学生签到APP(一)
- 2015060907 - 为什么有的工程师早晨醒来头发成为沟壑,角色无所谓就去上班呢?
- jira切换中文语言模式
- C++ [STL之vector模拟实现]