概述
字典衍生于列表,是表的基础。
字典的基础
字典是一个键值对的有序集合,即其他语言中的哈希表。
定义
字典的定义用!,左边是键,右边是值。可以用key来取得字典的键列表,value来取得字典的值列表。count用来取得字典的大小。cols也可以用来取得字典的键列表。
q)d:`Dent`Beeblebrox`Perfect!98 42 126 q)count d 3 q)key d `Dent`Beeblebrox`Perfect q)value d 98 42 126 q)d Dent | 98 Beeblebrox| 42 Perfect | 126 q)cols d `Dent`Beeblebrox`Perfect
字典的类型是99h。
注意:q不强制字典里键的唯一性,但是字典对于每一个输入只产生一个唯一的输出(对应该输入的第一个值),但是反向查找(也是查找对应该值的第一个键)仍然可以正常工作
q)e:`Dent`Beeblebrox`Perfect`Dent!98 42 126 1 q)count e 4 q)e[`Dent] 98 q)value e 98 42 126 1 q)e?1 `Dent
另外,两个字典的键值对顺序不同,即使它们有同样的键值对,它们也不是一样的。这跟Java等语言不一样,Java的哈希表是没有顺序的。
q)d1:`Prefect`Beeblebrox`Dent!126 42 98 q)d~d1 0b
访问
可以参考列表、函数,包括@
字典和列表
字典衍生于列表,其索引从整数扩展到非整数。字典不能用位置来索引。
q)d:"abcde"!1.1 2.2 3.3 4.4 5.5 q)d["c"] 3.3 q)d[0] 'type
个人猜测, 这是因为字典可以用整数作键
q)d:3 2 1 0!1.1 2.2 3.3 4.4 q)d[0] 4.4
比较列表和字典的相等性,看起来是比较它们的值,返回值仍然是一个字典
q)d:3 2 1 0!1.1 2.2 3.3 4.4 q)L:1.1 2.2 3.3 4.4 q)L=d 3| 1 2| 1 1| 1 0| 1 q)d:"abcd"!1.1 2.2 3.3 4.4 q)L=d a| 1 b| 1 c| 1 d| 1 q)type L=d 99h
但是字典和列表不会是一样的,即使字典也是用跟列表一样的整数索引
q)d:0 1 2!1.1 2.2 3.3 q)L:1.1 2.2 3.3 q)d~L 0b
非原子类型的键值列表
字典的键列表和值列表并不一定就是原子类型组成的,它们也可以包含其他列表。值列表可以是任意形式的嵌套列表,键列表如果是不统一的形式则会出现问题
q)d:(0 1; 2; 3)!`1`2`3 q)d[0 1] `1 q)d[2] ` q)d[3] `
该字典在访问到第一个不一致的键形式时失败。
子字典
我们可以通过键或者键列表来访问字典取得相应的值,同时我们也可以用#操作符来提取字典的指定键列表的一个子集。
q)d:`a`b`c!10 20 30 q)(enlist `c)#d c| 30 q)`a`c#d a| 10 c| 30
对于非原子类型的键依然适用。
针对字典的操作
修改和导入
对字典的修改跟列表一样,通过下标进行。不同的是,字典可以通过新的下标往字典添加新的键值对,而列表通过下标添加新的值会报错。这种插入/更新的行为称为upsert(导入)。
q)d:10 20 30!"abc" q)d[40]:"y" q)d 10| a 20| b 30| c 40| y q)L:"abc" q)L[3]:"x" 'length
?反向查找
同列表一样,字典支持反向查找(值-->键)。对于值重复的情况,返回找到的第一个键。如果找不到,则返回空值,类型是跟键列表一样(如果键列表是通用列表,空值是0N)。
移除词目(entry)
删除操作符_和cut都可以用于返回删除后的字典。
- 左参是字典,右参是要删除的键。如果左参是一个变量,左参与_之间必须有一个空格
- 左参是要删除的键列表,右参是字典。同样,如果左参是一个变量,左参与_之间必须有一个空格
基本操作
对于一元操作,操作的是字典的值列表,键列表不变
q)d1:`a`b`c!1 2 3 q)neg d1 a| -1 b| -2 c| -3 q)2*d1 a| 2 b| 4 c| 6 q)d1=2 a| 0 b| 1 c| 0
对于二元操作符,操作的是整个字典。对于键列表相同的字典,值列表会发生变化。对于键列表不同的字典,其结果的键列表是两个字典键列表的合集,如果有的键在两个字典中都存在,那么结果中对应的值是两个原字典对应的两个值操作之后的结果。
q)d1:`a`b`c!1 2 3 q)d2:`a`b`c!10 20 30 q)d1+d2 a| 11 b| 22 c| 33 q)d3:`a`d!1 4 q)d1+d3 a| 2 b| 2 c| 3 d| 4
连接
连接是将右边字典upsert到左边字典,对于左边字典不存在的项,执行附加操作,否则执行覆盖操作。
算术操作
对于算术(如加减乘除)和比较(如|和&)操作,操作只应用于两边字典相同的项,不同的项执行合并操作。对于关系操作(如大于小于),两边字典会扩展到相同的键列表(补以类型相同的空)后再执行操作。参考基本操作一章以了解哪些是算术、比较、关系操作。
列字典
列字典是表的基础。
定义和术语
c1...cn!(v1;...;vn)
ci是symbol,vi是同样大小的列表。ci是列名,vi是对应的列的值。
简单的例子
q)scores:`name`iq!(`Dent`Beeblebrox`Perfect;42 98 126) q)scores[`name] `Dent`Beeblebrox`Perfect q)scores.name `Dent`Beeblebrox`Perfect q)scores[`name][1] `Beeblebrox q)scores[`iq][2] 126 q)scores[`iq;2] 126 q)scores[`iq;] 42 98 126 q)scores[;2] name| `Perfect iq | 126
这些表示方法都已经在前面的章节提到过了
翻转字典
转换列字典的顺序
列字典:d:c1...cn!(v1;...;vn)
索引 | 0 | 1 | 2 |
name | Dent | Beeblebrox | Perfect |
iq | 42 | 98 | 126 |
按索引取值:d[ci;j]=vi[j]
按矩阵的规则,将d转换顺序变为t,t[j;ci]=t[j][ci]=d[ci;j]=vi[j]
索引 | name | iq |
0 | Dent | 42 |
1 | Beeblebrox | 98 |
2 | Perfect | 126 |
t[j]是一个跟d具有相同的键列表的字典,值列表是由v1到vn的第j个元素组成的列表(原文是v1![1],...,vn[j],应该是v1[j],...,vn[j])。
结论是:
- 列字典翻转后是由字典组成的一个列表
- 在该列表里的字典跟原来的字典具有相同的域(键列表)
- 该列表的第j个字典对应于原字典的每个值列表的第j个子元素
列字典的翻转
使用flip操作符
q)d name| Dent Beeblebrox Prefect iq | 98 42 126 q)flip d name iq -------------- Dent 98 Beeblebrox 42 Prefect 126
事实上值并没有发生变化,它只是简单的转换了索引的顺序,逻辑上等同于行、列的翻转。
列字典二次翻转
将列字典进行两次翻转后得到原来的字典。
q)d~flip flip d 1b
相关推荐
SQL Queries for Mere Mortals A Hands-On Guide to Data Manipulation in SQL(4th) 英文epub 第4版 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书
SQL Queries for Mere Mortals has earned worldwide praise as the clearest, simplest tutorial on writing effective queries with the latest SQL standards and database applications. Now, author John L. ...
You need UML for Mere Mortals™. This easy-to-read introduction is perfect for technical professionals and business stakeholders alike: anyone who needs to create, understand, or review UML models, ...
Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks.
- **书名**:《Database Design For Mere Mortals》(第二版) - **作者**:Michael J. Hernandez - **出版社**:Addison Wesley - **出版日期**:2003年3月5日 - **ISBN**:0-201-75284-0 - **页数**:672页 #### ...
Hernandez’s best-selling Database Design for Mere Mortals® has earned worldwide respect as the clearest, simplest way to learn relational database design. Now, he’s made this hands-on, software-...
标题《SQL Queries for Mere Mortals, 3rd Edition》和描述《SQL Queries for Mere Mortals A Hands-On Guide to Data Manipulation in SQL, 3rd Edition truePDF无水印》表明,本书是关于SQL数据操纵的实用指南,...
SQL Queries for Mere Mortals(3rd) 英文epub 第3版 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
SQL_Queries_For_Mere_Mortals(SQL 凡人入们查询)的配套光盘资料,包括书中样例数据库sql脚本以及查询脚本.
### SQL Queries for Mere Mortals:第二版的关键知识点解析 #### 一、书籍概述与推荐理由 《SQL Queries for Mere Mortals》第二版是一本深入浅出介绍SQL语言的优秀教程,它不仅适合初学者,也适用于有一定基础的...
用户界面设计,比较经典的一本书!不知道以前有人上传没有!
Database Design for Mere Mortals 是一本关于关系数据库设计的指导手册。本书的第三版于 2013 年出版,作者是 Michael J. Hernandez。该书旨在为读者提供实践指南,指导他们设计和实现关系数据库。 数据库设计的...
The #1 Easy, Common-Sense Guide to SQL Queries—Updated with More Advanced Techniques and Solutions
“这本书是我知道VSTO和.NET Framework后,最想得到的一本书。这本书对于那些使用VSTO的人和任何想从Office VBA转到VB.NET上来的人来说都是非常有用的。书中所讲的大量主题提供了比MSDN或其它任何地方都更深层次和以...
《Addison Wesley User Interface Design for Mere Mortals》是一本专为非专业设计师而写的界面设计书籍,旨在帮助读者理解并掌握用户界面设计的基本原则和技巧。这本书深入浅出地探讨了如何创建易于使用、直观且...