Python学习笔记之字典

字典是Python语言中唯一的映射类型。字典在某些语言中被称为联合内存或者联合数组。序列是以连续的整数为索引,而字典是以关键字为索引的,关键字可以是任何不可变类型的。

字典(dict)

字典是Python语言中唯一的映射类型。字典在某些语言中被称为联合内存或者联合数组。序列是以连续的整数为索引,而字典是以关键字为索引的,关键字可以是任何不可变类型的。字典类型和序列类型容器类(列表、元组)的区别在于两者的存储和访问数据的方式不同。序列类型只能用数字类型的键,映射类型可以用任何不可变类型的对象,一般情况下是用字符串做键。映射类型中的数据是无序排列的。序列类型用有序的数字键做索引将数据以数组的形式存储。

映射类型通常被称为哈希表是因为字典对象就是哈希类型的。

哈希表中储存的每一条数据叫做一个值(value),是根据与它相关的一个被称为键(key)的数据项进行储存的。哈希表的算法是获取键,对键执行一个叫做哈希函数的操作,并根据计算的结果,选择在数据结构的某个地址中来储存值。任何一个值存储的地址皆取决于它的键。我们可以用items()方法得到包含键、值对的元组的列表来排序。

字典的创建

我们可以把字典看作无序的键:值对集合,键必须互不相同,一对大括号{}创建一个空字典。初始化字典时,在大括号内放置一组逗号分隔的键:值对。

>>> dict1 = {}
>>> dict2 = {'name':'Joe','age':20}
>>> dict1,dict2
({}, {'age': 20, 'name': 'Joe'})

字典的访问

我们一般可以通过dictname[key]来访问字典的值对或者通过迭代器来访问。

>>> dict2['age']
20
>>> for key in dict2:
    print 'key = %s, value = %s' % (key,dict2[key])


key = age, value = 20
key = name, value = Joe

字典的更新

我们可以通过dictname[key]来更新字典的值对,通过del语句删除某一个键:值对。

>>> dict2['name'] = 'Bob' # 替换条目
>>> dict2
{'age': 20, 'name': 'Bob'}
>>> dict2['sex'] = 'male' # 添加条目
>>> dict2
{'age': 20, 'name': 'Bob', 'sex': 'male'}
>>> del dict2['sex']  # 删除条目
>>> dict2
{'age': 20, 'name': 'Bob'}

字典操作符

字典类型操作符除了不支持拼接(+)和重复(*)这样的操作,其他操作和序列操作几乎一样。

基本操作符

由于字典类型操作符和序列操作符几乎一样,这里不做说明。

>>> dict3 = {'abc':123}
>>> dict4 = {'abc':456}
>>> dict5 = {'abc':123,456:789}
>>> dict6 = {'xyz':123}
>>> dict3 > dict4
False
>>> (dict4 < dict5) and (dict4 < dict6)
True
>>> 'abc' in dict3
True
>>> 'abc' in dict6
False

字典的比较

由于字典的比较比较复杂,所以这里单独说明。对于字典来说,cmp()方法比较的算法是按照先比较字典的长度,再比较字典的键,最后比较字典的值对。

比较字典的长度

如果字典的长度不同,那么用cmp(dict1,dict2)比较大小时,如果字典dict1比dict2长,cmp()返回正值,反之负值。

>>> cmp(dict3,dict5)
-1
>>> cmp(dict5,dict4)
1

比较字典的键

如果字典的长度相同,那么就会按照字典的键比较。

>>> cmp(dict3,dict6)
-1

比较字典的值对

如果字典的长度和键都相同的情况下,就会按照字典的值对进行比较。

>>> cmp(dict3,dict4)
-1

hash()函数

hash()函数本身并不是为字典设计的方法,但它可以判断某个队形是否可以做一个字典的键,将一个 对象作为参数传递给hash(),会返回这个队形的哈希值。只有这个对象是可哈希的,才可以作为字典的键。非可哈希类型传递给hash()方法,会产生TypeError错误。

>>> hash(['abc'])

Traceback (most recent call last):
    File "<pyshell#28>", line 1, in <module>
    hash(['abc'])
TypeError: unhashable type: 'list'
>>> hash(('abc',))
594755148

字典的内建方法

  • dict.keys() 返回一个包含字典中键的列表
  • dict.values() 返回一个包含字典中所有值得列表
  • dict.items() 返回一个包含字典中键、值对元组的列表
  • dict.update(dict1) 将字典dict1的键-值对更新到字典dict中,字典中原有的键如果和新添加的键重复,那么重复键所对应的值对将会覆盖原来的值对,原来不存在的条目将会添加到字典中
  • dict.iter*() iteritems()、iterkeys()、itervalues()返回的是一个迭代子,而不是一个列表。

代码:

>>> dict1 = {'age': 20, 'name': 'Bob', 'sex': 'male'}
dict2 = {'name': 'Steven','city':'New York','age':24}
>>> dict1.values()
[20, 'Bob', 'male']
>>> dict1.keys()
['age', 'name', 'sex']
>>> dict1.update(dict2)
>>> dict1
{'city': 'New York', 'name': 'Steven', 'age': 24, 'sex': 'male'}
>>> for value in dict1.itervalues():
    print value


Steven
19
female
>>> for key in dict1.iterkeys():
    print key


name
age
sex
>>> for item in dict1.iteritems():
    print item


('name', 'Steven')
('age', 19)
('sex', 'female')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容