Python 简明教程 ---12,Python 字典

代码写的越急,程序跑得越慢。
—— Roy Carlson

目录

Python 字典是另一种非常实用的数据结构,在Python 中用dict 表示,是英文dictionary 的缩写。

>>> dict
<class 'dict'>

Python 中的dict 在其它编程语言中一般用map 表示,虽然叫法不同,但基本原来是相通的。

1,Python 字典

Python 字典中的数据,以键值对(key:value)的形式存储,字典存储的是一个一一对应映射关系。

Python 中的字典类型,有如下特点:

  • 字典中的 是唯一的,不重复的
  • 字典中的 可以是任意一种不可变类型,比如字符串数字元组
  • 字典中的可以是任意一种数据类型
  • 字典中的数据可以动态的删除/增加/修改
  • Python 会在需要的时候自动的扩容缩容,方便开发者使用

2,声明字典

Python 中的字典使用大括号{} 表示,字典中的值以key:value 的形式存储,注意keyvalue 之间有个冒号:

示例:

>>> d = {}  # 一个空字典

字典中的 可以是任意一种不可变类型,可以是任意类型:

>>> d = {'name':'jack', 'age':18, 'flag':True}  

提示:

虽然字典中的可以是任意的不可变类型数据,但大部分情况下,我们只会使用字符串 类型

字典中的不能是列表这样的可变类型的数据:

>>> l = [1, 2, 3]
>>> d = {l:'123'}  # 出现异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

3,字典元素个数

字典中元素的个数,就是字典中的个数,可以用len() 查看:

>>> d = {'name':'jack', 'age':18, 'flag':True}  
>>> len(d)
3

4,访问字典数据

使用索引访问某个元素

我们可以用变量名[键] 的格式来访问字典中的数据,在这里,被称为索引

>>> d = {'name':'jack', 'age':18, 'flag':True} 
>>> d['name']
'jack'
>>> d['age']
18
>>> d['scores']  # 访问一个不存在的键,会抛异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'scores'

使用for 循环遍历字典

除了使用索引 访问字典,还可以使用for 循环遍历字典:

>>> d = {'name':'jack', 'age':18, 'flag':True} 
>>> for key in d: # key 是 d 的键,d[key] 是对应的值
...     print('key:%s value:%s' % (key, d[key]))
... 
key:name value:jack
key:age value:18
key:flag value:True

上面的方式,是通过遍历字典中的键key,再通过索引的方式访问值d[key]

5,修改字典

字典的修改操作包括添加元素修改元素删除元素

添加和修改元素

使用索引赋值语句可以向字典中添加和修改元素:

  • 当给字典中一个已存在,再次赋值,就是修改元素
  • 当给字典中一个不已存在,去赋值,就是添加元素

示例:

>>> d = {'a':1}     # 初始化一个字典
>>> d['b'] = 2      # 给一个不存在的键去赋值,会添加元素
>>> d               # 字典中多了键值对 'b':2
{'a': 1, 'b': 2}
>>> d['a'] = 3      # 给一个已存在的键去赋值,会修改这个键的值
>>> d               # 键'a' 的值从原来的 1,变为了 3
{'a': 3, 'b': 2}

删除元素

使用索引del 关键字可以删除字典中的键值对:

>>> d = {'a': 3, 'b': 2}
>>> del d['a']
>>> d
{'b': 2}

6,字典包含

可以使用 innot in运算符,查看一个是否存在不存在于一个字典中:

>>> d = {'a':1, 'b':2}
>>> 'a' in d
True
>>> 'a' not in d
False

7,字典函数

可通过dir(dict)dir(字典对象) 来查看Python 字典支持的方法:

>>> dir(dict)
['__class__', '__contains__', 
'__delattr__', '__delitem__', 
'__dir__', '__doc__', '__eq__', 
'__format__', '__ge__', 
'__getattribute__', '__getitem__', 
'__gt__', '__hash__', '__init__', 
'__init_subclass__', '__iter__', 
'__le__', '__len__', '__lt__', 
'__ne__', '__new__', '__reduce__', 
'__reduce_ex__', '__repr__', 
'__setattr__', '__setitem__', 
'__sizeof__', '__str__', 
'__subclasshook__', 
'clear', 'copy', 'fromkeys', 'get', 
'items', 'keys', 'pop', 'popitem', 
'setdefault', 'update', 'values']

这里我们依然只关注非魔法方法,共11 个。

1.get 方法

作用:获取字典D 中的键k 的值D[k]
原型:D.get(k[,d]) -> D[k]
参数 k:要获取的
参数 d:当D 中不存在k 时,返回dd 可省,默认为None
返回值:如果k 存在,返回D[k],否则返回 d

示例:

>>> d = {'a':1}
>>> d.get('a')        # d['a'] 存在
1
>>> b = d.get('b')    # d['b'] 不存在,返回 None
>>> print(b)          # b 为 None
None
>>> b = d.get('b', 5) # d['b'] 不存在,返回 5
>>> print(b)          # b 为 5
5

2.update 方法

作用:使用EF 来更新字典D 中的元素
原型:D.update([E, ]**F) -> None
参数E字典或者其它可迭代类型
返回值:总是返回None

示例:

>>> d1 = {'a':1, 'c':3}
>>> d2 = {'a':5, 'b':7}
>>> d1.update(d2)   # 对于 d2 中的所有的键k,执行 d1[k] = d2[k]
>>> d1              
{'a': 5, 'c': 3, 'b': 7}
>>> d1.update(a=8, d=6) # 也可以是这种形式的参数
>>> d1
{'a': 8, 'c': 3, 'b': 7, 'd': 6}

3.fromkeys 方法

作用:创建一个新的字典,该字典以序列iterable 中的元素作为键,每个键的值都是value
原型:dict.fromkeys(iterable, value=None, /)
参数 iterable:可以是任意的可迭代类型
参数 value:新字典中的每个键的值都是value,可省,默认为None
返回值:一个新的字典

示例:

>>> dict.fromkeys({'a':1, 'c':3})  # 参数是字典类型
{'a': None, 'c': None}             # 一个新的字典,每个键的值都是 None
>>> dict.fromkeys({'a':1, 'c':3}, 5)
{'a': 5, 'c': 5}                   # 每个键的值都是 5
>>> dict.fromkeys(['a', 'b'])      # 参数是列表类型
{'a': None, 'b': None}

4.items 方法

作用:将字典D 转换成一个可遍历的列表,列表中的元素由D 中的键值对组成
原型:D.items() -> dict_items
参数:无
返回值:一个dict_items 类型的可遍历的列表

示例:

>>> d = {'a':1, 'c':3}
>>> items = d.items() 
>>> items # 将d 中的 key:vale 转成了 (key, value)
dict_items([('a', 1), ('c', 3)])
>>> type(items)       # 类型为 dict_items
<class 'dict_items'>

dict_items 类型理解为一个可遍历的列表即可,列表中的元素是元组类型

该方法常用于遍历字典:

>>> d = {'a':1, 'c':3}
>>> for k, v in d.items():
...     print(k, v)
... 
a 1
c 3

5.keys 方法

作用:返回字典D 中所有的
原型:D.keys() -> dict_keys
参数:无
返回值:一个dict_keys 类型的可遍历的列表

示例:

>>> d = {'a':1, 'c':3}
>>> keys = d.keys()
>>> keys      # 提取了 d 中所有的键
dict_keys(['a', 'c'])
>>> type(keys)
<class 'dict_keys'>

dict_keys 类型理解为一个可遍历的列表即可

6.values 方法

作用:返回字典D 中所有的
原型:D.values() -> dict_values
参数:无
返回值:一个dict_values 类型的可遍历的列表

示例:

>>> d = {'a':1, 'c':3}
>>> vs = d.values()
>>> vs     # 提取了 d 中所有的键
dict_values([1, 3])
>>> type(vs)
<class 'dict_values'>

dict_values 类型理解为一个可遍历的列表即可

7.pop 方法

作用:删除字典D 中的键k,并返回D[k]
原型:D.pop(k[,d]) -> v
参数 k:要删除的键
参数 d:若D[k] 存在,返回D[k],若D[k] 不存在,则返回d。参数d 可省
返回值

D[k] 存在时,返回D[k]
D[k] 不存在,参数d 存在时,返回d
D[k] 不存在且参数d 不存在,抛出KeyError 异常

示例,当要pop存在时:

>>> d = {'a': 1, 'c': 3}
>>> d.pop('c')     # d['c'] 存在
3                  # 返回 d['c']
>>> d              # 键 'c' 被删除,只剩 'a'
{'a': 1} 

示例,当要pop存在时:

>>> d.pop('c')     # 键 'c' 不存在,抛出异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'c'
>>> 
>>> d.pop('c', 5)  # 键'c' 不存在,但有第二个参数
5                  # 返回第 2 个参数

8.popitem 方法

作用:删除并返回字典D 中的最后一个键值对,顺序是先进后出
原型:D.popitem() -> (k, v)
参数:无
返回值:一个元组类型,D 为空时,抛出异常

关于popitem 的顺序:

  • 如果声明字典时,已有元素,按照从左到右的书写顺序,左为前,右为后
  • 当动态向字典中增加元素时,先加入的为前,后加入的为后

示例,声明字典时,已有元素:

>>> d = {'c':3, 'a':1, 'b':2}
>>> d           # 顺序为 c,a,b
{'c': 3, 'a': 1, 'b': 2}
>>> d.popitem() # pop 出 'b'
('b', 2)
>>> d           # 还剩 c, a
{'c': 3, 'a': 1}
>>> d.popitem() # pop 出 'a'
('a', 1)
>>> d           # 还剩 'c'
{'c': 3}

向字典中添加元素zx

>>> d['z'] = 6  # 增加 'z'
>>> d
{'c': 3, 'z': 6}
>>> d['x'] = 8  # 再增加 'x'
>>> d           # 现在的顺序为 c,z,x
{'c': 3, 'z': 6, 'x': 8}  

再次执行popitem

>>> d.popitem() # pop 出 x
('x', 8)
>>> d           # 还剩 c,z
{'c': 3, 'z': 6}
>>> d.popitem() # pop 出 z
('z', 6)
>>> d           # 还剩 c
{'c': 3}
>>> d.popitem() # pop 出 c
('c', 3)
>>> d           # 字典为空
{}

字典为空时,执行popitem,抛出异常:

>>> d.popitem() # 抛出异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'popitem(): dictionary is empty'

9.setdefault 方法

作用:设置字典D 中键k 的值

D[k] 存在时:不做任何事情,只返回D[k]
D[k] 不存在时:执行D[k] = d,并返回d

原型:D.setdefault(k[,d]) -> value
参数 k:要设置的键
参数 d:要设置的值,可省,默认为 None
返回值:返回D[k]

示例,当要设置的键存在时:

>>> d = {'a':1}
>>> d.setdefault('a')    # d['a'] 存在,只返回d['a']
1
>>> d                    # d 不改变
{'a': 1}
>>> d.setdefault('a', 5) # d['a'] 存在,只返回d['a']
1
>>> d                    # d 不改变
{'a': 1}

当要设置的键不存在时:

>>> i = d.setdefault('b') # d['b'] 不存在,没有第 2 个参数
>>> d                     # 执行 d['b'] = None
{'a': 1, 'b': None}       # 执行后的结果   
>>> print(i)              # 返回值为 None
None
>>> d.setdefault('x', 6) # d['x'] 不存在,有第 2 个参数,执行d['x'] = 6
6                        # 返回 d['x']
>>> d                    # d 现在的值
{'a': 1, 'b': None, 'x': 6}

10.clear 方法

作用:清空字典D
原型:D.clear() -> None
参数:无
返回值:总是返回 None

示例:

>>> d = {'a': 1, 'b': None, 'x': 6}
>>> d.clear()
>>> d   # d 为空
{}

11.copy 方法

作用:浅拷贝字典D
原型:D.copy() -> dict
参数:无
返回值:字典D 的副本

示例:

>>> d = {'a': 1, 'b': None, 'x': 6}
>>> d1 = d.copy()
>>> d1
{'a': 1, 'b': None, 'x': 6}

(完。)


推荐阅读:

Python 简明教程 --- 7,Python 字符串
Python 简明教程 --- 8,Python 字符串函数
Python 简明教程 --- 9,Python 编码
Python 简明教程 ---10,Python 列表
Python 简明教程 ---11,Python 元组

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

推荐阅读更多精彩内容