今天开始介绍python的另一种重要的数据类型——字典(Dictionary)。顾名思义,就是像字典一样,根据“单词”查找“解释”的一种数据结构。在python里,“单词”就是索引,叫键(Key),“解释”就是值(Value)。
字典是无序的(不像列表,不支持序列操作,如下标索引index、切片slice等)不能用位置0,1,2, ...来索引,只能通过键名来索引。这一特点,非常适合给物品的属性建模,在数学上适合给稀疏数据结构建模。
字典在本质上,是建立了一个hash表,存放着键和指向数据的指针(地址)。python优化了hash查找算法,使得查找键的速度非常快。
例如,我们描述一个STDCELL,
name : BUF
area : 1um2
delay : 1ns
那么,我们用python的字典就可以表示成,
这就是定义字典的一个例子,语法上,把冒号:分隔的键值对(key:value pairs)用逗号分开,再用大括号{}括在一起。
第二种定义方法,调用字典类的构造函数dict(**kwargs)。如,
这种方法就像函数传参数一样。
在大部分情况下,在字典定义的时刻并不知道所有的数据, 所以最常用的方法还是像下面这样:
随着读入外部文件的一行行的解析,逐渐的构建字典。
最基本的操作就是根据索引(用方括号)取值,如
还有一种根据索引取值的方法,用get()函数,如
注:get()
函数,当键不存在时,返回空None。如果希望当键不存在时,返回一个默认值,可以这样用:stdcell.get('buf2', '0um2')
,这有时候很有用。
用len()
计算字典的元素个数,如
修改元素的值,如
另一种方法是用update()函数,如
这种方法可以一次更新多个值,甚至增加新的键值对。
删除元素用pop()
,如,
还有清空函数clear()
,如,
分别提取字典的键和值的列表:keys()
、values()
keys()
可以配合for循环对字典有序输出,在后面介绍循环的时候会重点介绍。
最后介绍判断键是否存在的操作in
,这是一个关键字,不是函数。如
如果存在返回True,不存在返回False。一般配合if条件语句来用,后面介绍条件语句时有重点介绍。
通过上面的介绍,可以看出字典与列表有两个相同点:可变长度和可修改。
整理下字典与列表的异同点:
Table | 字典 | 列表 |
---|---|---|
序列 | 无序,通过键来索引 | 有序,用位置来索引。支持序列操作,如slice。 |
可变长度 | 是 | 是 |
可修改 | 是 | 是 |
常用函数 | get, keys, values, pop, update, clear等 | count, extend, index, insert, pop, remove, reverse, sort, clear等。 |
注:在PC端浏览,表格显示效果更佳。
最后我们用表格来整理一个python字典、perl哈希、tcl字典、C哈希的区别,方便大家学习:
Table | python字典 | perl哈希 | tcl字典 | C哈希 |
---|---|---|---|---|
定义 | d={'name':'bill'} | my %d=('name'=>'bill'); | set d [dict create name 'bill'] | c语言本身不自带(一般是基于“结构体+链表”从零开始码) |
判断是否存在键 | 'name' in d | exists $d{'name'} | dict exists $d name | 自己写函数实现 |
是否可变长 | 是 | 是 | 是 | 是 |
常用操作 | get, keys, values, pop, update, clear | 仅有keys, values, exists, delete等 | append, create, exists, filter, for, get, incr, info, keys, lappend, merge, remove, replace, set, size, unset, update, values, with(函数最丰富) | 自己写函数实现 |
注:在PC端浏览,表格显示效果更佳。
到此为止,主要的数据类型我们就介绍完了。剩下的其它类型如,文件、集合等后面实际用到时再作介绍。
下一次我们将进入下一个章节,介绍语句(if else、for、while)。