1. 定義
字典是key-values pairs
, 可是在q中,字典是按照list
來存儲的。字典的建立使用操做符!
,讀做bang
:) 全部的字典類型都是99h
。java
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值。
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
列字典(Column Dictionary)是表(Table)的基礎。
1. 定義和術語
一個通常的列字典具備以下的形式:
c1...cn!(v1;...;vn)
其中ci
是symbol
類型,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
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.(翻轉並不會改變數據的存儲)