`
silentlakeside
  • 浏览: 107315 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Q for Mortals2笔记 -- 列表

    博客分类:
  • kdb+
 
阅读更多

列表的介绍

  • 列表可以只包含原子类型,也可以包含其他列表
  • 列表可以只包含一种类型的元素(叫简单列表),例如只包含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的约束和计算都是基于列的从而非常快,比关系型数据库(按无序的行存储数据)快出几个数量级。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics