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

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

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

如何定义一个字典?

例如,我们描述一个,

name : BUF

area : 1um2

delay : 1ns

那么,我们用的字典就可以表示成,

= {‘name’:’BUF’, ‘area’:’1um2′, ‘delay’:’1ns’}

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

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

= dict(name=’BUF’, area=’1um2′, delay=’1ns’)

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

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

= {}

[‘buf0’] = ‘0.2um2’ #注意,这里是方括号[]

[‘buf1’] = ‘0.6um2’

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

字典有哪些操作?

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

[‘buf0’]

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

.get(‘buf0’)

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

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

len()

修改元素的值,如

[‘buf0’] = ‘0.3um2’

#{‘buf0′:’0.3um2’, ‘buf1′:’0.6um2’}

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

= {‘buf0′:’0.4um2’, ‘buf2′:’0.8um2’}

.()

#{‘buf0′:’0.4um2’, ‘buf1′:’0.6um2’, ‘buf2′:’0.8um2’}

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

删除元素用pop(),如,

.pop(‘buf0’) #{‘buf1′:’0.6um2’, ‘buf2′:’0.8um2’}

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

.clear() #{}

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

.keys() #[‘buf0’, ‘buf1’]

.() #[‘0.3um2’, ‘0.6um2’]

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

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

‘buf0’ in

如果存在返回True,不存在返回False。一般配合if条件语句来用,后面介绍条件语句时有重点介绍。

字典与列表的异同?

通过上面的介绍,可以看出字典与列表有两个相同点:可变长度和可修改。

整理下字典与列表的异同点:

字典

列表

序列

无序,通过键来索引

有序,用位置来索引。支持序列操作,如slice。

可变长度

可修改

常用函数

get, keys, , pop, , clear等

count, , index, , pop, , , sort, clear等

与其它编程语言的异同?

最后我们用表格来整理一个字典、perl哈希、tcl字典、C哈希的区别,方便大家学习:

字典

perl哈希

tcl字典

C哈希

定义

d = {‘name’:’bill’}

my %d = (‘name’=>’bill’);

set d [dict name ‘bill’]

c语言本身不自带(一般是基于“结构体+链表”从零开始码)

判断是否存在键

‘name’ in d

$d{‘name’}

dict $d name

自己写函数实现

是否可变长

常用操作

get, keys, , pop, , clear

仅有keys, , , 等

, , , , for, get, incr, info, keys, , merge, ,

set, size, unset, , , with

(函数最丰富)

自己写函数实现

到此为止,主要的数据类型我们就介绍完了。剩下的其它类型如,文件、集合等后面实际用到时再作介绍。

下一次我们将进入下一个章节,介绍语句(if else、for、while)。

——————–

欢迎关注. 分享芯片数字集成电路设计中的经验和方法。ther.

加入IP合伙人(站长加盟) | 全面包装你的品牌,搭建一个全自动交付的网赚资源独立站 | 晴天实测8个月运营已稳定月入3W+
限时特惠:本站每日持续更新海量内部创业教程,一年会员只需98元,全站资源免费无限制下载点击查看会员权益

站长微信: qtw123cn

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注