ExASIC
分享让工作更轻松

python的数据类型(五):字典Dict

今天开始介绍python的另一种重要的数据类型——字典(Dictionary)。顾名思义,就是像字典一样,根据“单词”查找“解释”的一种数据结构。在python里,“单词”就是索引,叫键(Key),“解释”就是值(Value)。

字典是无序的(不像列表,不支持序列操作,如下标索引index、切片slice等)不能用位置0,1,2, ...来索引,只能通过键名来索引。这一特点,非常适合给物品的属性建模,在数学上适合给稀疏数据结构建模。

字典在本质上,是建立了一个hash表,存放着键和指向数据的指针(地址)。python优化了hash查找算法,使得查找键的速度非常快。

如何定义一个字典?

例如,我们描述一个STDCELL,
name : BUF
area : 1um2
delay : 1ns
那么,我们用python的字典就可以表示成,

stdcell = {'name':'BUF', 'area':'1um2', 'delay':'1ns'}

这就是定义字典的一个例子,语法上,把冒号:分隔的键值对(key:value pairs)用逗号分开,再用大括号{}括在一起。

第二种定义方法,调用字典类的构造函数dict(**kwargs)。如,

stdcell = dict(name='BUF', area='1um2', delay='1ns')

这种方法就像函数传参数一样。

在大部分情况下,在字典定义的时刻并不知道所有的数据, 所以最常用的方法还是像下面这样:

stdcell = {}
stdcell['buf0'] = '0.2um2' #注意,这里是方括号[]
stdcell['buf1'] = '0.6um2'

随着读入外部文件的一行行的解析,逐渐的构建字典。

字典有哪些操作?

最基本的操作就是根据索引(用方括号)取值,如

stdcell['buf0']

还有一种根据索引取值的方法,用get()函数,如

stdcell.get('buf0')

注:get()函数,当键不存在时,返回空None。如果希望当键不存在时,返回一个默认值,可以这样用:stdcell.get('buf2', '0um2'),这有时候很有用。

len()计算字典的元素个数,如

len(stdcell)

修改元素的值,如

stdcell['buf0'] = '0.3um2'   
#{'buf0':'0.3um2', 'buf1':'0.6um2'}

另一种方法是用update()函数,如

stdcell_new = {'buf0':'0.4um2', 'buf2':'0.8um2'}
stdcell.update(stdcell_new) 
#{'buf0':'0.4um2', 'buf1':'0.6um2', 'buf2':'0.8um2'}

这种方法可以一次更新多个值,甚至增加新的键值对。

删除元素用pop(),如,

stdcell.pop('buf0')  #{'buf1':'0.6um2', 'buf2':'0.8um2'}

还有清空函数clear(),如,

stdcell.clear()  #{}

分别提取字典的键和值的列表:keys()values()

stdcell.keys()     #['buf0', 'buf1']
stdcell.values()  #['0.3um2', '0.6um2']

keys()可以配合for循环对字典有序输出,在后面介绍循环的时候会重点介绍。

最后介绍判断键是否存在的操作in,这是一个关键字,不是函数。如

'buf0' in stdcell

如果存在返回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)。

阅读数:
更多文章:文章目录
解惑专区
(支持markdown插入源代码)
欢迎使用ExASIC订阅服务
仅用于ExASIC最新文章通知,方便及时阅读。
友情链接: IC技术圈问答ReCclayCrazyFPGA