5. Q語言學習之路—字典

1. 字典基礎

1. 定義
字典是key-values pairs, 可是在q中,字典是按照list來存儲的。字典的建立使用操做符!,讀做bang :) 全部的字典類型都是99hjava

q)10 20 30!1.1 2.2 3.3
10| 1.1
20| 2.2
30| 3.3

q)`a`b`c!100 200 300
a| 100
b| 200
c| 300

可使用操做符key, value, count來分別獲取字典的鍵、值和個數。python

儘管q語言不強制鍵的惟一性(historical mistake),可是卻對每一個輸入值都提供惟一的輸出,只有第一次出現的key會被看到。

當你知道字典的鍵是unique的時候,可使用命令`u#將字典轉換爲哈希表,這樣與原來的線性搜索相比,會提升查找的速度。sql

q)(`u#`a`b`c)!10 20 30

注意:與傳統語言不同,不一樣順序的字典在q中是不等的。c#

q)(`a`b`c!10 20 30)~`a`c`b!10 30 20
0b

2. 空和單例字典 atom

空字典:code

()!()

帶類型的空字典:索引

`symbol$()!`float$()

單例字典,必需要使用enlist形式先生成一個list,不然會報錯ip

q)(enlist `x)!enlist 42
x| 42

3. 查找
使用中括號或者並列的形式:ci

q)d:`a`b`c!10 20 30
q)d[`a]
10
q)d `b
20

當查找值不在字典的鍵表中時,返回值列表中初始值類型的Null值:io

q)d[`x]
0N

4. 逆向查找 使用?
與列表相似,?返回在字典中對應的

q)d:`a`b`c`a!10 20 30 10
q)d?10
`a

當查找的值不在字典的值列表中時,返回鍵列表中初始值類型的Null值:

q)d:`a`b`c`a!10 20 30 10
q)d?40
`

5. 字典和列表
能夠經過字典來表示一個稀疏列表:

q)d1:0 100 500000!10 20 30
q)d2:0 99 1000000!100 200 300
q)d1+d2
0      | 110
100    | 20
500000 | 30
99     | 200
1000000| 300

6. 不惟一的鍵和值
如以前所說,當鍵不惟一時,會返回第一個出現時的值:

q)ddup:`a`b`a`c!10 20 30 20
q)ddup[`a]
10

逆向查找同理:

q)ddup?30
`a
q)ddup?20
`b

7. Non-simple 鍵 和 值

鍵和值是嵌套的列表:

q)d:(`a`b; `c`d`e; enlist `f)!10 20 30
q)d `f
30
q)d?20
`c`d`e
q)d:`a`b`c!(10 20; 30 40 50; enlist 60)
q)d `b
30 40 50
q)d?30 40 50
`b
q)d?enlist 60

注意,對單個元素的鍵或值要單獨對其生成一個列表(enlist),不然會有以下的問題:

q)dwhackey:(1 2; 3 4 5; 6; 7 8)!10 20 30 40 / atom 6 is whack
q)dwhackey 1 2
10
q)dwhackey 6
0N
q)dwhackval:10 20 30 40!(1 2; 3 4 5; 6; 7 8) / atom 6 is whack
q)dwhackval?3 4 5
20
q)dwhackval?6
0N

會致使查找失敗,返回Null值。

2. 字典操做

1. Amend 和 Upsert

update:

q)d:`a`b`c!10 20 30
q)d[`b]:42

insert:

q)d:`a`b`c!10 20 30
q)d[`x]:42

在q語言中,update/insert操做被稱爲upsert操做。

2. 提取子字典
使用提取操做符#,左運算元爲子字典的鍵,右運算元爲原始字典。 另外,當原始字典有重複鍵時,只會提取第一次出現的鍵:

q)ddup:`a`b`a`c!10 20 30 20
q)`a`c#ddup
a| 10
c| 20

3. 刪除
使用操做符_, 用法與#相似,但須要注意_先後要加空格

q)d:`a`b`c!10 20 30
q)`a`c _ d
b| 20
q)(enlist `b) _ d

刪除所有鍵值對會獲得一個帶類型的空字典:

q)d:`a`b`c!10 20 30
q)`a`b`c _ d
q)-3!`a`b`c _ d
"(`symbol$())!`long$()"

操做符cut_在字典上的效果相同。

另一個不多用的用法是,字典在_的左邊,_右運算元爲一個單一的鍵,表示字典刪除這個鍵:

q)d _ `b
a| 10
c| 30

4. 字典上的基礎運算
一些常見的基礎運算以下例所示,很是容易理解

q)d:`a`b`c!10 20 30
q)neg d
a| -10
b| -20
c| -30

字典的加法: 相同鍵值進行加法操做,不一樣鍵值保留下來

q)d1:`a`b`c!1 2 3
q)d2:`b`c`d!20 30 40
q)d1+d2
a| 1
b| 22
c| 33
d| 40

5. join,
使用,進行合併字典的操做,因爲q語言是right to left特性的,因此合併的兩個字典若是有相同的鍵值,那麼右邊的會保留下來。

q)d1:`a`b`c!10 20 30
q)d2:`c`d!300 400
q)d1,d2
a| 10
b| 20
c| 300
d| 400

所以,字典合併時,先後順序很重要

6. Coalesce ^
這種合併方式相似於,合併, 但與其不一樣的是,當^右邊右邊項值爲Null時不覆蓋左邊項,見下例:

q)d1:`a`b`c!10 0N 30
q)d2:`b`c`d!200 0N 400

q)d1^d2
a| 10
b| 200
c| 30
d| 400

q)d1,d2
a| 10
b| 200
c|
d| 400

7. 算術和相等運算符
對於相等性比較,因爲null表明缺失值,因此全部的null值會被認爲是相等的。

q)(`a`b`c!10 20 30)=`b`c`d!20 300 400
a| 0
b| 1
c| 0
d| 0
q)(`a`b`c!0N 20 30)=`b`c`d!20 300 0N
a| 1
b| 1
c| 0
d| 1
q)(`a`b`c!10 20 30)<`b`c`d!20 300 400
a| 0
b| 0
c| 1
d| 1

3. 列字典

列字典(Column Dictionary)是表(Table)的基礎。

1. 定義和術語
一個通常的列字典具備以下的形式:

c1...cn!(v1;...;vn)

其中cisymbol類型,vi是具備相同長度的列表。一般vi均爲簡單列表。

2. 簡單例子

q)travelers:`name`iq!(`Dent`Beeblebrox`Prefect;42 98 126)
q)travelers
name| Dent Beeblebrox Prefect
iq  | 42   98         126

索引:

q)travelers[`name; 1]
`Beeblebrox
q)travelers[`iq; 2]
126

單列的字典:

q)dc1:(enlist `c)!enlist 10 20 30
q)dc1
c| 10 20 30

4. 列字典的翻轉

q)dc:`c1`c2!(`a`b`c; 10 20 30)
q)dc
c1| a b c
c2| 10 20 30
q)t:flip dc
q)t
c1 c2
-----
a 10
b 20
c 30

索引:

q)dc[`c1; 0]
`a
q)dc[`c1; 1]
`b
q)dc[`c1; 2]
`c
q)t[0; `c1]
`a
q)t[1; `c1]
`b
q)t[2; `c1]
`c
Unlike the case of transposing rectangular lists, transposing a column dictionary does not physically re-arrange data.(翻轉並不會改變數據的存儲)
相關文章
相關標籤/搜索