国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

3. Q語言學(xué)習(xí)之路—Lists

wwq0327 / 2842人閱讀

摘要:簡單所有中的元素都是同種類型的,這種列表具有很好的儲存和性能占據(jù)連續(xù)的儲存空間。索引域如果索引在合理的邊界之外,結(jié)果不是一個錯誤,而會返回一個值,表示,返回的值類型與第一個元素的類型一致。其結(jié)果是右側(cè)元素占據(jù)左側(cè)元素,除非右側(cè)元素為值。

0. 概述

所有Q中的數(shù)據(jù)類型最終都是由list構(gòu)造的:一個字段(dictionary)是由一對list構(gòu)造的;一個表是一個特殊的字典;一個鍵表(keyed table)是一對表。因此熟悉一下list還是很重要的。

List支持索引取值,并且支持不同元素類型,可以把q list當作動態(tài)分配的數(shù)組。

1. 簡介

1. 定義
一個list是一個存儲q data的有序容器,使用括號表示,并且使用分號來分割元素。

q)(1; 1.1; `1)
1
1.1
`1
q)(1;2;3)
1 2 3
q)("a";"b";"c";"d")
"abcd"
q)(`Life;`the;`Universe;`and;`Everything)
`Life`the`Universe`and`Everything
q)(-10.0; 3.1415e; 1b; `abc; "z")
-10f
3.1415e
1b
`abc
"z"
q)((1; 2; 3); (4; 5))
1 2 3
4 5
q)((1; 2; 3); (`1; "2"; 3); 4.4)
1 2 3
(`1;"2";3)
4.4

注意到?jīng)]個的輸出結(jié)果不太一樣,第一個和最后三個是general list,意味著list中的元素非同質(zhì)的。

list同樣可以被復(fù)制給變量:

q)L1:(1;2;3)
q)L2:("z";"a";"p";"h";"o";"d")
q)L3:((1; 2; 3); (`1; "2"; 3); 4.4)

2. count
count相當于length, 返回list中元素的個數(shù), 類型為long

q)count (1;2;3)
3

在q3中,list中元素最多有2^64-1個;在q2中,最多有20億個。

count也可以對atom進行操作,盡管它們不是list,但仍返回1:

q) count 42
1

類似于count的操作符還有firstlast,返回list中第一個和最后一個元素。

2. 簡單list

Simple list: 所有l(wèi)ist中的元素都是同種類型的,這種列表具有很好的儲存和性能(占據(jù)連續(xù)的儲存空間)。

You can always use general list notation, even for simple lists.
當q檢測到一個list中元素是同種類型的時候,它會自動地將list轉(zhuǎn)換為簡單list。

1. 簡單整型list
對于任何數(shù)值類的List,在表示的時候,都可以忽略掉括號和分號,元素之間用空格隔開。

q)(100;200;300)
100 200 300
q)100 200 300
100 200 300
q)100 200 300~(100; 200 ; 300)
1b

q)(1h; 2h; 3h)
1 2 3h

注意1 2 3h這種形式的表示,后綴h是作用在整個List的元素上,而(1;2;3h)中后綴h僅僅作用在最后一個元素上,該list是一個general list.

q)(1; 2; 3h)
1
2
3h

2. 簡單浮點型list

q)123.4567 9876.543 99
123.4567 9876.543 99

q console壓縮了小數(shù)部分為0的浮點數(shù),上式中的99不是整型: 即當在一個float list中加入一個看似整型數(shù)字的時候,q會認為僅僅省略了數(shù)字右邊的小數(shù)部分,因此你仍然得到的是一個簡單浮點型list.

3. 簡單Binary list
甚至可以省略空格符,
boolean類型以后綴b結(jié)尾:

q)(0b;1b;0b;1b;1b)
01011b
q)01011b
01011b

byte類型以0x開頭:

q)(0x20;0xa1;0xff)
0x20a1ff
q)0x20a1ff~(0x20;0xa1;0xff)
1b

GUID類型與integer類型一樣,以空格符分離

q)3?0Ng
8c6b8b64-6815-6084-0a3e-178401251b68 5ae7962d-49f2-404d-5aec-f7c8abbae288 5a5..

4. 簡單Symbol list
中間沒有空格分隔, 如果有空格會報錯

q)(`Life;`the;`Universe;`and;`Everything)
`Life`the`Universe`and`Everything
q)`Life`the`Universe`and`Everything
`Life`the`Universe`and`Everything

q)`bad `news
"bad

5. 簡單char list和String

char list的簡化形式像許多語言中的string類型;事實上, char list被稱為string,由于string是list類型,因此不能比較兩個不同長度string的大小。

q)("s"; "t"; "r"; "i"; "n"; "g")
"string"
q)"string"
"string"

比較:

q)"string"="text"
"length
q)"string"~"text"
0b

6. 時間類型list
由于它們實際上是整型, 所以簡化版本的simple list以空格符進行分隔:

q)(2000.01.01; 2001.01.01; 2002.01.01)
2000.01.01 2001.01.01 2002.01.01
q)(00:00:00.000; 00:00:01.000; 00:00:02.000)
00:00:00.000 00:00:01.000 00:00:02.000

對于混合日期類型的list,所有元素的類型與第一個元素保持一致,可以追加一個類型指定符來指定list元素類型:

q)12:34 01:02:03
12:34:00 01:02:03

q)01:02:03 12:34 11:59:59.999u
01:02 12:34 11:59
3. 空和單例list

1. 一般的空list
()( )表示一個空list,其在q console中沒有顯示。可以使用-3!()來強制顯示()

2. 單例list
一個singleton表示一個只含有一個元素的list. 由于()除了用來生成列表外,還是數(shù)學(xué)表達式中的符號,單單使用(42)會得到元數(shù)據(jù)42,因此不可能用()來生成一個單例list.

單例list用函數(shù)enlist來創(chuàng)建:

q)enlist 42
,42
只帶有一個元素的string不能夠被寫為"a",這只是一個character的元數(shù)據(jù),應(yīng)當使用`enlist. This is a common error for qbies.
q)"a"
"a"
q)enlist "a"
, "a"

注意單例并不一定要以atom作為它僅有的元素,它可以是任何q元素:

q)enlist 1 2 3
1 2 3
q)enlist (10 20 30; `a`b`c)
10 20 30 a b c
4. 索引

1. 標識

[i]的形式:

q)(100; 200; 300)[0]
100
q)100 200 300[0]
100
q)L:100 200 300
q)L[0]
100

2. 索引賦值

q)L:1 2 3
q)L[1]:42
q)L
1 42 3

注意向簡單list賦值的時候,賦值類型必須與list元素的類型保持一致,否則會報錯。

3. 索引域
如果索引在合理的邊界之外,結(jié)果不是一個錯誤,而會返回一個Null值,表示“missing data”, 返回的Null值類型與第一個元素的類型一致。

q)L1:1 2 3 4
q)L1[4]
0N
q)L2:1.1 2.2 3.3
q)L2[-1]
0n
q)L3:(`1; 2; 3.3)
q)L3[0W]
`

4. 空索引和Null項

一個忽略的索引返回整個list:

q)L:10 20 30 40
q)L[]
10 20 30 40

空索引與索引為空的list不同,后者會返回一個空的list,可以用指令-3!來強制顯示

q)-3!L[()]
"()"

雙冒號::代表nil,即零(無)項,返list所有元素。

q)L[::]
10 20 30 40

同時,在list中使用::可以避免general list在被轉(zhuǎn)換為simple list之后,無法再賦值的情況,具體見下例:

q)L:(::; 1 ; 2 ; 3; `a)
q)L[4]:4
q)L[4]:`a
5. 合并list

1. , join

逗號連接符,右邊的list被拷貝到一個左邊list的拷貝上,join同時支持atom,即支持作用于單元素。

q)1 2 3,4 5
1 2 3 4 5
q)1,2 3 4
1 2 3 4
q)1 2 3,4
1 2 3 4

可以使用(), x或者x, ()來生成x的單元素list,效果等同于enlist x

2. ^ merge
另一種合并list的方法是,對于兩個長度相等的list, 可以使用^對它們合并。其結(jié)果是右側(cè)元素占據(jù)左側(cè)元素,除非右側(cè)元素為null值。

q)L1:10 0N 30
q)L2:100 200 0N
q)L1^L2
100 200 30
6. list作為map

list將索引i映射到元素L[i]

I    O
0    1 2
1    3 4
7. list 嵌套

1. 深度
list中的元素為list稱為嵌套,嵌套的層數(shù)為深度depth, atom的depth是0, 簡單list的depth為1.

q)L:(1;2;(100;200))
q)count L
3

2. 圖例

8. list 多重索引

可以使用L[1][2][0]或者L[1;2;0](注意是分號)來讀取元素,前者被稱為iterated indexing,后者被稱為index at depth

其中,index at depth方法可以賦值,但是iterated indexing不支持賦值操作:

q)L:(1; (100; 200; (1000 2000 3000 4000)))
q)L[1; 2; 0]: 999
q)L
(1; (100; 200; (999 2000 3000 4000)))
q)L[1][2][0]:42
"assign

構(gòu)造matrix的一個方法:Reshape操作符#,下面代碼中的0N(missing data)類似于python中的-1

q)2 0N#til 10
0 1 2 3 4
5 6 7 8 9
q)0N 3#til 10
0 1 2
3 4 5
6 7 8
,9
9. 使用list索引

1. 提取多個元素
我們可以使用簡單list作為索引, 索引可以是任意順序,甚至可以是重復(fù)的。

q)L:100 200 300 400
q)L[0 2]
100 300
q)L[0 2 0]
100 300 100

2. 通過變量索引

q)L
100 200 300 400
q)I:0 2
q)L[I]
100 300

3. 通過嵌套list索引
返回的結(jié)果與嵌套索引list具有相同的shape

q)L:100 200 300 400
q)L[(0 1; 2 3)]
100 200
300 400

4. 通過索引list賦值

q)L[1 2 3]:2000 3000 4000

賦值操作是按照從左到右的順序進行的

q)L[3 2 1]:999 888 777
is equivalent to,
q)L[3]:999
q)L[2]:888
q)L[1]:777

因此,如果對重復(fù)項進行賦值的時候,最右邊的項被保留下來。

q)L:100 200 300 400
q)L[0 1 0 3]:1000 2000 3000 4000
q)L
3000 2000 300 4000

也可以對多個元素賦同一個值,使用下面的格式:

q)L:100 200 300 400
q)L[1 3]:999
q)L
100 999 300 999

5. 并列索引
可以在list后僅僅使用空格符分隔來索引:

q)L:100 200 300 400
q)L[0]
100
q)L 0
100
q)L[2 1]
300 200
q)L 2 1
300 200
q)I:2 1
q)L I
300 200
q)L ::
100 200 300 400

6. ? 查找
返回右側(cè)元素在左側(cè)list中的位置索引

q)1001 1002 1003?1002
1

如果所查找的元素不在list里,那么將會返回整個list的count值,即長度:

q)1001 1002 1003?1004
3

find操作符右側(cè)同樣可以是一個list

q)1001 1002 1003?1003 1001
10. 隱藏的索引

1. 矩陣的隱藏索引

q)m:(1 2 3 4; 100 200 300 400; 1000 2000 3000 4000)
q)m[1;]
100 200 300 400
m[;3]
4 400 4000

2. 深度嵌套list的隱藏索引

q)L:((1 2 3;4 5 6 7);(`a`b`c`d;`z`y`x`;`0`1`2);("now";"is";"the"))
q)L
(1 2 3;4 5 6 7)
(`a`b`c`d;`z`y`x`;`0`1`2)
("now";"is";"the")
q)L[;1;]
4 5 6 7
`z`y`x`
"is"
q)L[;;2]
3 6
`c`x`2
"w e"

其中,L[;1;]表示取所有頂層元素在index 1的所有元素; L[;;2]表示取第二層元素在index 2的元素。

11. 方陣list和矩陣

1. 方陣

方陣list是一個包含長度相等list的list,但這個方陣不一定是傳統(tǒng)的矩陣,也可以是嵌套的矩陣,如下所示:

q)L:(1 2 3; (10 20; 100 200; 1000 2000))
q)L
1 2 3
10 20 100 200 1000 2000

可以使用flip函數(shù)對方陣進行轉(zhuǎn)置操作,flip操作會分配新的儲存空間并且拷貝原數(shù)據(jù)。

q)L:(1 2 3; 10 20 30; 100 200 300)
q)L
1 2 3
10 20 30
100 200 300
q)flip L
1 10 100
2 20 200
3 30 300

2. 矩陣
矩陣的正式定義是遞歸的,0維矩陣是一個標量,1維矩陣是一個簡單list;對于n>1,n維矩陣是一個size相等的n-1維矩陣的list。

可以通過list來索引一個矩陣:

q)m:(1 2; 10 20; 100 200; 1000 2000)
q)m 0 2
1    2
100  200
12. 一些有用的list操作符

1. til
以一個非負整數(shù)作為參數(shù),返回從0開始的連續(xù)自然數(shù)

q)til 10
0 1 2 3 4 5 6 7 8 9
q)1+til 10
q)2*til 10
q)1+2*til 10
q)-5+4*til 3

2. distinct

q)distinct 1 2 3 2 3 4 6 4 3 5 6
1 2 3 4 6 5

3. where
返回1b對應(yīng)位置上的元素

q)where 101010b
0 2 4
q)L:10 20 30 40 50
q)L[where L>20]:42
q)L
10 20 42 42 42

4. group
返回所有元素出現(xiàn)的位置

q)group "i miss mississippi"
i| 0 3 8 11 14 17
 | 1 6
m| 2 7
s| 4 5 9 10 12 13
p| 15 16

End.

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/17954.html

相關(guān)文章

  • 8. Q語言學(xué)習(xí)之路—表

    摘要:其中代表了列的類型,表示了是否存在任何外鍵。事實上,語言會自動地識別滿足表形式的列字典,在沒有任何請求詢問下,將其轉(zhuǎn)換為表形式。結(jié)果顯示的結(jié)果永遠是一個表。被用來合并兩個具有相同列的鍵表。屬性表明對所有出現(xiàn)的值,相同的值都是互相鄰近的。 0. 概述 表(Tables)和列表、字典一樣,都是q語言中的第一類對象(First-class entity) Q表是*列導(dǎo)向的* Q表是從字典構(gòu)...

    syoya 評論0 收藏0
  • [Leetcode] Merge Two Sorted Lists Merge K Sorted L

    摘要:注意因為堆中是鏈表節(jié)點,我們在初始化堆時還要新建一個的類。代碼初始化大小為的堆拿出堆頂元素將堆頂元素的下一個加入堆中 Merge Two Sorted Lists 最新更新請見:https://yanjia.me/zh/2019/01/... Merge two sorted linked lists and return it as a new list. The new list...

    stefanieliang 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<