一. 字典的特点
- 列表是对象的有序集合,而字典是无序集。
- 对于列表(其他复合数据类型也一样)来说,元素只有值;而对于字典,元素由 key:value 对的形式组成。
- 字典中的元素通过 key 来访问,而非通过他们的位置来访问(主要区别)。
- 字典是一个关联数组(也称为哈希),其中的任何 key 都与 value 相关联(或映射),所以字典是无序的 key:value 对。
- value 可以是 Python 中的任何数据类型,key 必须不可变,可以用数字、字符串或元组充当。不能用列表。
- 字典不支持序列数据类型(例如:字符串、元组和列表)的序列操作(例如:索引、切片、连接 +、重复 *),字典属于内置映射类型,同时也是该类型的唯一代表!
二. 创建和使用字典
1. 创建字典
语法格式如下:
d = {key1:value1, key2:value2}
- 字典由多个键及其对应的值构成的对(把键 / 值对称为项)。
- 将所有项(元素)放在花括号(
{}
)内,每个项之间以逗号(,
)分隔,键值对用冒号(:)分隔。 - 空字典(不包括任何项)由两个大括号组成,如{}。
- 字典中的 key 必须是唯一的,但值不一定。
- 值可以取任何数据类型;键必须不可变,可以用数字、字符串或元组充当,不能用列表。
- key 重复时,虽然没有报错,但前面的值被后面的覆盖了
>>>
>>> dic = {} # 空字典
>>> dic
{}
>>>
>>> dic = {1:'Python', 2:'C++'} # key 是整形
>>>
>>>
>>> dic = {'name':'python', 2:[1, 2, 3]} # key 是混合类型
>>>
>>> dic = dict([(1,'Python'), (2,'C++')]) # 使用 dict() 函数
>>> dic
{1: 'Python', 2: 'C++'}
>>>
>>> dic = {'name':'python', (1, 2):'C++'} # 具有不可变元素的元组
>>>
>>> {'name':'python', [1, 2]:'C++'} # 列表
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>>
>>> {'name':'Python', 'name':'C++'} # key 重复
{'name': 'C++'}
>>> #虽然没有报错,但前面的值被后面的覆盖了
...
>>>
2. 访问字典元素
字典通过 key 来检索 value,有两种方式:
- 在方括号(
[]
)内使用 key - key 与 get() 方法与一起使用
区别在于:使用 get(),如果没有找到 key,则返回 None,而不是 KeyError。
>>> dict0 = {'name':'zth','age':20}
>>>
>>>
>>> dict0['name']
'zth'
>>>
>>> dict0.get('age')
20
>>>
>>> dict0['zth'] # 没有找到 key,引发 KeyError
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'zth'
>>>
>>> print(dict0.get(20)) # 没有找到 key,返回默认值
None
3. dict() 函数
dict() 函数用于创建一个字典。
语法
class dict(**kwarg)
class dict(mapping, **kwarg)
class dict(iterable, **kwarg)
参数说明:
- **kwargs -- 关键字
- mapping -- 元素的容器。
- iterable -- 可迭代对象。
返回值
返回一个字典。
>>>dict() # 创建空字典
{}
>>> dict(a='a', b='b', t='t') # 传入关键字
{'a': 'a', 'b': 'b', 't': 't'}
>>> dict(zip(['one', 'two', 'three'], [1, 2, 3])) # 映射函数方式来构造字典
{'three': 3, 'two': 2, 'one': 1}
>>> dict([('one', 1), ('two', 2), ('three', 3)]) # 可迭代对象方式来构造字典
{'three': 3, 'two': 2, 'one': 1}
三. 字典的基本操作
1. 更改或添加元素
字典是可变的,可以添加新元素,也可以使用赋值运算符(=
)更改现有元素的值。
如果 key 存在,value 将被更新;否则,新的 key:value 对会被添加到字典中。
>>> dict0 = {}
>>>
>>>
>>> dict0['name'] = 'zth' # 添加项
>>> dict0
{'name': 'zth'}
>>>
>>> dict0['aeg'] = 21 # 添加项
>>> dict0
{'name': 'zth', 'aeg': 21}
>>>
>>> dict0['aeg'] = 20 # 更新
>>> dict0
{'name': 'zth', 'aeg': 20}
2. 删除字典或字典的项
通过使用 pop() 方法,可以删除指定 key 对应的元素,并返回其 value。
popitem() 方法可以用来删除并返回一个任意元素 (key, value)。
使用 del 关键字来删除单个元素或整个字典本身。
clear() 方法则会一次性删除所有元素。
>>> dict0 = {'name': 'zth', 'age': 20, 'sex':'M', 'grade':None}
>>>
>>>
>>> dict0.pop('grade') # 删除某一项
>>> dict0
{'name': 'zth', 'age': 20, 'sex': 'M'}
>>>
>>> dict0.popitem() # 删除任意一项
('sex', 'M')
>>> dict0
{'name': 'zth', 'age': 20}
>>>
>>>
>>> del dict0['age'] # 删除某一项
>>> dict0
{'name': 'zth'}
>>>
>>> dict0.clear() # 清空 - 删除所有项
>>> dict0
{}
>>>
>>>
>>> del dict0 # 删除字典
>>> dict0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'dict0' is not defined
3. 成员测试
可以测试一个 key 是否存在于字典中,使用关键字 in。
注意: 成员测试仅适用于 key,不适用于 value。
>>> dict0 = {'name': 'zth', 'aeg': 20, 'sex':'M'}
>>>
>>> 'name' in dict0
True
>>>
>>> 'grade' in dict0
False
>>>
>>> 'zth' in dict0 # 不能检测 value
False
>>>
4. 遍历字典
使用 for 循环,可以遍历字典中的每个 key。
>>> dict0 = {'name': 'zth', 'aeg': 20, 'sex':'M'}
>>>
>>>
>>> for key in dict0:
... print(key)
...
name
aeg
sex
5. 字典内置函数
函数 | 描述 |
all() | 如果字典的所有 key 都是 True(或者字典为空),返回 True。 |
any() | 用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。 |
len() | 返回字典的长度(元素个数) |
sorted() | 返回一个新的排序字典(不排序字典本身) |
str(dict) | 输出字典,以可打印的字符串表示。 |
type() | 返回输入的变量类型,如果变量是字典就返回字典类型。 |
>>> dict0 = {'name': 'zth', 'aeg': 20, 'sex':'M'}
>>>
>>> all(dict0)
True
>>>
>>> all({'name': 'zth', 0:20})
False
>>>
>>>
>>> any({'name': 'zth', 0:20})
True
>>>
>>> any({():23, 0:20})
False
>>>
>>>
>>> len(dict0)
3
>>> sorted(dict0)
['aeg', 'name', 'sex']
>>>
>>> str(dict0)
"{'name': 'zth', 'aeg': 20, 'sex': 'M'}"
>>>
>>>
>>> type(dict0)
<class 'dict'>
6. 字典的格式化字符串
字典的格式化方式是在每个转化说明符中的 % 字符后加上用圆括号括起来的键,再跟上其他说明元素。
>>> dict0 = {'name': 'zth', 'aeg': 20, 'sex':'M'}
>>>
>>> print('姓名: %(name)s'%dict0)
姓名: zth
四. 字典方法
1. clear() 方法
clear() 函数用于删除字典内所有元素。
clear()方法语法:
dict.clear()
- 参数: 无。
- 返回值: 该函数没有任何返回值。
2. copy()
Python 字典 copy() 函数返回一个字典的浅复制。
copy()方法语法:
dict.copy()
-
参数: 无。
-
返回值: 返回一个字典的浅复制。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
dict1 = {'user':'zth','num':[1,2,3]}
dict2 = dict1 # 浅拷贝: 引用对象
dict3 = dict1.copy() # 浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用
# 修改 data 数据
dict1['user']='root'
dict1['num'].remove(1)
# 输出结果
print(dict1)
print(dict2)
print(dict3)
print('\n\n')
dict3['user'] = 'fbb'
print('dict1: ',dict1)
print('dict3: ',dict3)
print('\n\n')
dict3['num'].remove(2)
print('dict1: ',dict1)
print('dict3: ',dict3)
print('\n\n')
print('dict2: ',dict2)
执行结果:
pydev debugger: starting (pid: 1432)
{'user': 'root', 'num': [2, 3]}
{'user': 'root', 'num': [2, 3]}
{'user': 'zth', 'num': [2, 3]}
dict1: {'user': 'root', 'num': [2, 3]}
dict3: {'user': 'fbb', 'num': [2, 3]}
dict1: {'user': 'root', 'num': [3]}
dict3: {'user': 'fbb', 'num': [3]}
dict2: {'user': 'root', 'num': [3]}
- 赋值:浅拷贝, 引用对象。
- copy:浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用
- 替换副本的值时,原始字典不受影响。
- 如果修改了副本某个值(原地修改,不是替换),原始字典就会改变,因为同样的值也在原字典中。
3. fromkeys()
fromkeys() 函数用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值。
fromkeys()方法语法:
dict.fromkeys(seq[, value])
参数
- seq -- 字典键值列表。
- value -- 可选参数, 设置键序列(seq)的值。
返回值
该方法返回列表。
>>> seq = ( 'name','age','sex')
>>>
>>> dict1 = dict.fromkeys(seq)
>>> dict1
{'name': None, 'age': None, 'sex': None}
>>>
>>>
>>> dict1 = dict.fromkeys(seq,10)
>>>
>>> dict1
{'name': 10, 'age': 10, 'sex': 10}
4. get()
get() 函数返回指定键的值,如果值不在字典中返回默认值。
get()方法语法:
dict.get(key, default=None)
参数
- key -- 字典中要查找的键。
- default -- 如果指定键的值不存在时,返回该默认值值。
返回值
返回指定键的值,如果值不在字典中返回默认值 None。
>>> dict1 = {'Name': 'zth', 'Age': 20}
>>>
>>> print(dict1.get('Name'))
zth
>>>
>>> print(dict1.get('sex'))
None
>>>
>>> print(dict1.get('sex','未指定'))
未指定
5. key in dict 方法
in 操作符用于判断键是否存在于字典中,如果键在字典 dict 里返回 true,否则返回 false。
语法
in 操作符语法:
key in dict
参数
- key -- 要在字典中查找的键。
返回值
如果键在字典里返回true,否则返回false。
>>> student={'小萌': '1001', '小智': '1002'}
>>> print('小萌在student字典中:%s'%('小萌' in student))
小萌在student字典中:True
>>> print('小强在student字典中:%s'%('小强' in student))
小强在student字典中:False
6. items()
items() 方法以列表返回可遍历的(键, 值) 元组数组。
items()方法语法:
dict.items()
- 参数: 无
- 返回值: 返回可遍历的(键, 值) 元组数组。
>>> dict0 = {'name': 'zth', 'aeg': 20}
>>>
>>> dict0.items()
dict_items([('name', 'zth'), ('aeg', 20)])
7. keys()
Python3 字典 keys() 方法返回一个迭代器,可以使用 list() 来转换为列表。
注意:Python2.x 是直接返回列表
keys()方法语法:
dict.keys()
- 参数: 无
- 返回值: 返回一个迭代器。
>>> dict0 = {'name': 'zth', 'aeg': 20}
>>>
>>> dict0.keys()
dict_keys(['name', 'aeg'])
>>>
>>>
>>> list(dict0.keys())
['name', 'aeg']
8. setdefault()
setdefault() 方法和get()方法类似,用于获得与给定键相关联的值。 如果键不存在于字典中,将会添加键并将值设为默认值。
setdefault()方法语法:
dict.setdefault(key, default=None)
参数
- key -- 查找的键值。
- default -- 键不存在时,设置的默认键值。
返回值
如果 key 在 字典中,返回对应的值。如果不在字典中,则插入 key 及设置的默认值 default,并返回 default ,default 默认值为 None。
>>> dict0 = {'name': 'zth', 'aeg': 20}
>>>
>>> dict0.setdefault('name')
'zth'
>>>
>>> dict0.setdefault('sex')
>>> print( dict0.setdefault('sex'))
None
>>>
>>> print( dict0.setdefault('sex','M'))
None
>>>
>>> print( dict0.setdefault('grade','86'))
86
>>> dict0
{'name': 'zth', 'aeg': 20, 'sex': None, 'grade': '86'}
9. update()
update() 函数把字典参数 dict2 的 key/value(键/值) 对更新到字典 dict 里。
update() 方法语法:
dict.update(dict2)
- 参数:dict2 -- 添加到指定字典dict里的字典。
- 返回值:该方法没有任何返回值。
10. vaules()
values() 方法返回一个迭代器,可以使用 list() 来转换为列表,列表为字典中的所有值。
values()方法语法:
dict.values()
- 参数: 无
- 返回值: 返回迭代器。
>>> dict0 = {'name': 'zth', 'aeg': 20}
>>>
>>> dict0.values()
dict_values(['zth', 20])
>>>
>>>
>>> list(dict0.values())
['zth', 20]