摘要:注意與傳統(tǒng)語(yǔ)言不一樣,不同順序的字典在中是不等的。字典操作和在語(yǔ)言中,操作被稱為操作。提取子字典使用提取操作符,左運(yùn)算元為子字典的鍵,右運(yùn)算元為原始字典。列字典列字典是表的基礎(chǔ)。
1. 字典基礎(chǔ)
1. 定義
字典是key-values pairs, 但是在q中,字典是按照list來(lái)存儲(chǔ)的。字典的創(chuàng)建使用操作符!,讀作bang :) 所有的字典類型都是99h。
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來(lái)分別獲取字典的鍵、值和個(gè)數(shù)。
盡管q語(yǔ)言不強(qiáng)制鍵的唯一性(historical mistake),但是卻對(duì)每個(gè)輸入值都提供唯一的輸出,只有第一次出現(xiàn)的key會(huì)被看到。
當(dāng)你知道字典的鍵是unique的時(shí)候,可以使用命令`u#將字典轉(zhuǎn)換為哈希表,這樣與原來(lái)的線性搜索相比,會(huì)提高查找的速度。
q)(`u#`a`b`c)!10 20 30
注意:與傳統(tǒng)語(yǔ)言不一樣,不同順序的字典在q中是不等的。
q)(`a`b`c!10 20 30)~`a`c`b!10 30 20 0b
2. 空和單例字典
空字典:
()!()
帶類型的空字典:
`symbol$()!`float$()
單例字典,必須要使用enlist形式先生成一個(gè)list,否則會(huì)報(bào)錯(cuò)
q)(enlist `x)!enlist 42 x| 42
3. 查找
使用中括號(hào)或者并列的形式:
q)d:`a`b`c!10 20 30 q)d[`a] 10 q)d `b 20
當(dāng)查找值不在字典的鍵表中時(shí),返回值列表中初始值類型的Null值:
q)d[`x] 0N
4. 逆向查找 使用?
與列表類似,?返回值在字典中對(duì)應(yīng)的鍵。
q)d:`a`b`c`a!10 20 30 10 q)d?10 `a
當(dāng)查找的值不在字典的值列表中時(shí),返回鍵列表中初始值類型的Null值:
q)d:`a`b`c`a!10 20 30 10 q)d?40 `
5. 字典和列表
可以通過(guò)字典來(lái)表示一個(gè)稀疏列表:
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. 不唯一的鍵和值
如之前所說(shuō),當(dāng)鍵不唯一時(shí),會(huì)返回第一個(gè)出現(xiàn)時(shí)的值:
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
注意,對(duì)單個(gè)元素的鍵或值要多帶帶對(duì)其生成一個(gè)列表(enlist),否則會(huì)有如下的問題:
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
會(huì)導(dǎo)致查找失敗,返回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語(yǔ)言中,update/insert操作被稱為upsert操作。
2. 提取子字典
使用提取操作符#,左運(yùn)算元為子字典的鍵,右運(yùn)算元為原始字典。 另外,當(dāng)原始字典有重復(fù)鍵時(shí),只會(huì)提取第一次出現(xiàn)的鍵:
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
刪除全部鍵值對(duì)會(huì)得到一個(gè)帶類型的空字典:
q)d:`a`b`c!10 20 30 q)`a`b`c _ d q)-3!`a`b`c _ d "(`symbol$())!`long$()"
操作符cut與_在字典上的效果相同。
另外一個(gè)很少用的用法是,字典在_的左邊,_右運(yùn)算元為一個(gè)單一的鍵,表示字典刪除這個(gè)鍵:
q)d _ `b a| 10 c| 30
4. 字典上的基礎(chǔ)運(yùn)算
一些常見的基礎(chǔ)運(yùn)算如下例所示,非常容易理解
q)d:`a`b`c!10 20 30 q)neg d a| -10 b| -20 c| -30
字典的加法: 相同鍵值進(jìn)行加法操作,不同鍵值保留下來(lái)
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,
使用,進(jìn)行合并字典的操作,由于q語(yǔ)言是right to left特性的,所以合并的兩個(gè)字典如果有相同的鍵值,那么右邊的會(huì)保留下來(lái)。
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
因此,字典合并時(shí),前后順序很重要。
6. Coalesce ^
這種合并方式類似于,合并, 但與其不同的是,當(dāng)^右邊右邊項(xiàng)值為Null時(shí)不覆蓋左邊項(xiàng),見下例:
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. 算術(shù)和相等運(yùn)算符
對(duì)于相等性比較,由于null代表缺失值,所以所有的null值會(huì)被認(rèn)為是相等的。
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| 13. 列字典
列字典(Column Dictionary)是表(Table)的基礎(chǔ)。
1. 定義和術(shù)語(yǔ)
一個(gè)一般的列字典具有如下的形式:
c1...cn!(v1;...;vn)
其中ci是symbol類型,vi是具有相同長(zhǎng)度的列表。通常vi均為簡(jiǎn)單列表。
2. 簡(jiǎn)單例子
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 304. 列字典的翻轉(zhuǎn)
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.(翻轉(zhuǎn)并不會(huì)改變數(shù)據(jù)的存儲(chǔ))
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/17975.html
摘要:其中代表了列的類型,表示了是否存在任何外鍵。事實(shí)上,語(yǔ)言會(huì)自動(dòng)地識(shí)別滿足表形式的列字典,在沒有任何請(qǐng)求詢問下,將其轉(zhuǎn)換為表形式。結(jié)果顯示的結(jié)果永遠(yuǎn)是一個(gè)表。被用來(lái)合并兩個(gè)具有相同列的鍵表。屬性表明對(duì)所有出現(xiàn)的值,相同的值都是互相鄰近的。 0. 概述 表(Tables)和列表、字典一樣,都是q語(yǔ)言中的第一類對(duì)象(First-class entity) Q表是*列導(dǎo)向的* Q表是從字典構(gòu)...
閱讀 3905·2021-09-02 15:11
閱讀 4921·2021-08-16 10:47
閱讀 1742·2019-08-29 18:35
閱讀 3278·2019-08-28 17:54
閱讀 3012·2019-08-26 11:37
閱讀 1650·2019-08-23 16:51
閱讀 1983·2019-08-23 14:36
閱讀 1958·2019-08-23 14:21