python的数据类型(五):字典Dict
专栏:ExASIC Oct. 26, 2024, 8:28 p.m. 145 阅读
字典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哈希的区别,方便大家学习:

Tablepython字典perl哈希tcl字典C哈希
定义d={'name':'bill'}my %d=('name'=>'bill');set d [dict create name 'bill']c语言本身不自带(一般是基于“结构体+链表”从零开始码)
判断是否存在键'name' in dexists $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)。

感谢阅读,更多文章点击这里:【专栏:ExASIC】
最新20篇 开设专栏