16_字典(dict)


时间:2018-11-03 作者:魏文应


一、字典

什么是字典?

  • 字典属于一种新的数据结构,称为映射(mapping)。
  • 字典的作用和列表类似,都是用来存储对象的容器。
  • 列表存储数据的性能很好,但是查询数据的性能很差。
  • 在查询元素时,字典的效率是非常快的。
  • 在字典中,每一个元素都有一个唯一的名字,通过这个唯一的名字,可以快速的查找到指定的元素。

在字典中,可以保存多个对象,每个对象都会有一个唯一的名字:

  • 这个唯一的名字,我们称其为 键(key),通过 key 可以快速的查询 value 。
  • 这个对象,我们称其为值(value)。
  • 所以字典,我们也叫做 键值对(key-value) 结构 。
  • 每一个键值对,我们称其为一项(item)。

创建字典

字典通过大括号 { } 进行创建,例如:

d = {} # 创建了一个空字典

字典创建的语法如下:

# 字典的值可以是任意对象
# 字典的键可以是任意的不可变对象(int、str、bool、tuple ...)
#     字典的键不能重复,一般用字符串 str。
{key:value, key:value, key:value}

例如:

d = {
    'name': '孙悟空',
    'age': 18,
    'gender': '男'
}

print(d['name'], d['age'], d['gender'])

通过 索引到了 ,打印结果如下:

孙悟空 18 男

dict() 函数创建字典

使用 dict() 函数创建字典:

d = dict(name='孙悟空', age=18, gender='男')
print(d, type(d))

这种方式创建的字典,key 都是字符串,打印结果如下:

{'name': '孙悟空', 'age': 18, 'gender': '男'} <class 'dict'>

dict() 函数,也可以将一个包含有 双值子序列的序列 转换为字典:

d = dict([('name', '孙悟空'), ('age', 18)])
print(d, type(d))

子序列中,前面一个元素为键,后面一个元素为值,打印结果如下:

{'name': '孙悟空', 'age': 18} <class 'dict'>

双值序列

序列中只有两个字值的序列叫做 双值序列,比如下面的都是双值序列:

[1, 3]
['a', 1]
'ab'

子序列

如果序列中的元素也是序列,那么称这个元素为 子序列。比如:

[(1, 3), (3, 5)]

获取键值对个数

可以通过 len() 函数,获取字典中键值对的个数,比如:

d = {'a':1, 'b':2, 'c':3}
print(len(d))

这就获取了字典 d 中的键值对个数,打印结果如下:

3

检查是否包含某个键

可以使用 in 检查字典中是否包含某个键,比如:

d = {'a': 1, 'b': 2, 'c': 3}
print('hello' in d)

上面,检查 hello 这个键在不在 d 这个字典中,打印结果如下:

False

get() 方法获取键

可以使用 get() 方法,来获取键,如果键不存在,返回 None 。比如:

d = {
    'name': '孙悟空',
    'age': 18,
    'gender': '男'
}

print(d.get('name'))  # 返回键值孙悟空
print(d.get('hello'))  # hello 键没有,返回 None
print(d.get('hello', '没有hello'))  # 没有hello键时,返回 '没有hello'

如果直接使用 d['hello'] 去索引字典,程序会因为字典没有这个键而报错,通过get()方法则不会报错,打印结果如下:

孙悟空
None
没有hello

修改字典

可以通过 d[key] = value 的方式,来进行字典元素值的修改:

d = {'name': '孙悟空','age': 18,'gender': '男'}
d['name'] = 'sunwukong'
print(d)

上面,修改了键为 name 的值,打印结果如下:

{'name': 'sunwukong', 'age': 18, 'gender': '男'}

如果没有对应的键,则在字典末尾自动添加,比如:

d = {'name': '孙悟空','age': 18,'gender': '男'}
d['address'] = '花果山'
print(d)

上面,因为没有 address 这个键,所以,就自动在末尾添加一个键值对 'address': '花果山',打印结果如下:

{'name': '孙悟空', 'age': 18, 'gender': '男', 'address': '花果山'}

可以使用 setdefualt(key[, default]) 方法,来向字典添加 key-value :

  • 如果 key 已经存在于字典中,则返回 key 值,不会对字典做任何操作。
  • 如果 key 不存在,则向字典中添加这个 key ,并设置 value 。
d = {'name': '孙悟空', 'age': 18, 'gender': '男'}
d.setdefault('name', '猪八戒')
print(d)
d.setdefault('address', '花果山')
print(d)

所以,打印结果如下:

{'name': '孙悟空', 'age': 18, 'gender': '男'}
{'name': '孙悟空', 'age': 18, 'gender': '男', 'address': '花果山'}

合并字典

可以使用 update() 方法,合并字典,如果遇到相同的键,则更新这个键的值。比如:

d = {'a': 1, 'b': 2, 'c': 3}
d2 = {'d': 4, 'e': 5, 'f': 6, 'a': 7}
d2.update(d)
print(d2)

d 被合并到了 d2 后面,相同的键名 a 的对应的值被更新了,打印结果如下:

{'d': 4, 'e': 5, 'f': 6, 'a': 1, 'b': 2, 'c': 3}

删除字典中的键值对

可以使 del 删除字典中的一个键值对,例如:

d = {'a': 1, 'b': 2, 'c': 3}
del d['a']
print(d)

上面,就会把键值对 'a': 1 删除掉,打印结果如下:

{'b': 2, 'c': 3}

如果没有对应的键名,则会报错,比如:

d = {'a': 1, 'b': 2, 'c': 3}
del d['f']    # 这里会报错

还可以使用 popitem()随机删除 字典中的一个键值对,一般都会删除最后一个键值对:

  • 删除之后,它会将删除的 key-value 作为返回值返回。
  • 返回的是一个元组,元组中有两个元素,第一个是已经删除的 key,第二个是删除的 value 。
d = {'a': 1, 'b': 2, 'c': 3}
result = d.popitem()
print('result =',result)
print(d)

打印结果如下:

result = ('c', 3)
{'a': 1, 'b': 2}

还可以使用 pop() 方法进行删除指定的键值对:

  • 根据 key 删除字典中的 key-value 。
  • 如果删除不存在的 key ,会抛出异常。
  • 如果指定了默认值,当遇到不存在的 key 时,不会报错,而是直接返回默认值。
d = {'a': 1, 'b': 2, 'c': 3}
result = d.pop('a')
print('result =', result)
print(d)
result = d.pop('f', '键值不存在')
print('result =', result)

打印结果如下:

result = 1
{'b': 2, 'c': 3}
result = 键值不存在

清空字典(clear)

可以使用 clear() 方法,清空字典内的所有键值对:

d = {'a': 1, 'b': 2, 'c': 3}
d.clear()
print(d)

上面,清空了字典 d 内的所有键值对,打印结果如下:

{}

浅复制

可以使用 copy() 方法进行复制操作,将一个字典 d 复制到 d2 中。注意:

  • 浅复制只是简单复制对象的值,如果值是一个 可变对象,这个可变对象不会被复制。
d = {'a': {'name': '猪八戒'}, 'b': 2, 'c': 3}
d2 = d.copy()
d2['a']['name'] = '孙悟空'
d2['b'] = 11
print('d =', d, id(d))
print('d2 = ', d2, id(d2))

上面, dd2 是相互对立的,但键值对 'a': {'name': '猪八戒'} 的值是一个可变对象,d2['a']['name'] = '孙悟空' 会使得 dd2都发生改变。可以理解为,字典 dd2 的键值对的值只是保存了变量的地址。

遍历字典

字典的遍历,有多种方法,可以使用 keys() 方法,获取 键值对

d = {'a': {'name': '猪八戒'}, 'b': 2, 'c': 3}
for k in d.keys():
    print(k, d[k])

上面,打印结果如下:

name 沙和尚
b 2
c 3

也可以通过 value() 方法,但这样只获取到

d = {'name': '沙和尚', 'b': 2, 'c': 3}
for v in d.values():
    print(v)

上面,打印结果如下:

沙和尚
2
3

还可以使用 items() 方法,它会返回序列,序列中包含有 双值子序列

d = {'name': '沙和尚', 'b': 2, 'c': 3}
print(d.items())
for k, v in d.items():
    print(k, '=', v)

打印结果如下:

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

推荐阅读更多精彩内容

  • 转载自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay阅读 6,118评论 1 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • ✨6M14D✨ 🥕胡萝卜米糊 ❤️胡萝卜切丁,加几滴核桃油入炒锅略炒 ❤️入辅食机蒸15分钟 ❤️蒸好倒入搅拌机加...
    susie268阅读 193评论 0 0
  • 关于青春里的小爱情,是你我共同的记忆。好似年少无知,又似命中注定。 海子说:“什么季节,你最惆怅,放下了忙乱的箩筐...
    蜗小懒的小公举阅读 375评论 0 1
  • 蹦吧,一切烦恼就清空了 攀吧,一切思绪就清零了 跳吧,一切事物就归零了 跑吧,一切关系就破碎了
    艾塔小馒头阅读 128评论 1 0