时间: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))
上面, d
和 d2
是相互对立的,但键值对 'a': {'name': '猪八戒'}
的值是一个可变对象,d2['a']['name'] = '孙悟空'
会使得 d
和 d2
都发生改变。可以理解为,字典 d
和 d2
的键值对的值只是保存了变量的地址。
遍历字典
字典的遍历,有多种方法,可以使用 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