字典是一种可变容器模型,且可存储任意类型对象。字典的每个键值key->value
对用冒号:
分割,每个对之间用逗号,
分割,整个字典包括在花括号{}
中,格式如下所示:
d = {key1: value, key: value2}
键必须是唯一的,但值则不必。值可以取任何数据类型,但键必须是不可变的,如字符串,数字。
创建字典
>>> mydict = {} #创建一个空字典
>>> mydict
{}
>>> type(mydict)
<class 'dict'>
>>> language = {1:'Python',2:'Java',3:'C',4:'C++'} #创建非空字典
>>> language
{1: 'Python', 2: 'Java', 3: 'C', 4: 'C++'}
利用元组构建字典
>>> name = (["1","Google"],["2","microsoft"])
>>> website = dict(name)
>>> website
{'1': 'Google', '2': 'microsoft'}
或者这样
>>> md = dict(name = "john",age = 20)
>>> md
{'name': 'john', 'age': 20}
使用fromkeys()
创建字典
>>> website = {}.fromkeys(("first","second"),"weibo")
>>> website
{'first': 'weibo', 'second': 'weibo'}
访问字典的值
字典类型对象是以键值对的形式存储数据的,所以,只要知道键,就能得到值。本质上就是一种映射关系。
>>> person = {'name1':'john','name2':'tom','name3':'jerry'}
>>> person['name3']
'jerry'
# 若果用字典里没有的键访问数据,则会报以下错误:
>>> person['name4']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'name4'
修改字典
新增键/值对
>>> person = {'name1':'john','name2':'tom','name3':'jerry'}
>>> person['name4'] = 'tracy'
>>> person
{'name1': 'john', 'name2': 'tom', 'name3': 'jerry', 'name4': 'tracy'}
修改键/值对
>>> person = {'name1': 'john', 'name2': 'tom', 'name3': 'jerry', 'name4': 'tracy'}
>>> person['name1'] = 'amy'
>>> person
{'name1': 'amy', 'name2': 'tom', 'name3': 'jerry', 'name4': 'tracy'}
删除字典元素
可以删除单一键/值对,也能清空字典
>>> person = {'name1': 'amy', 'name2': 'tom', 'name3': 'jerry', 'name4': 'tracy'}
>>> del person['name4'] # 删除键 'name4'
>>> person
{'name1': 'amy', 'name2': 'tom', 'name3': 'jerry'}
>>> person.clear() # 清空字典
>>> person
{}
>>> del person # 删除字典
>>> person
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'person' is not defined
字典键的特性
字典值可以是任何的Python
对象,既可以是标准的对象,也可以是用户定义的,但键不行。需要注意的两点是:
-
不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住,即相当于更新了该键的值。
>>> person = {'name1': 'john', 'name2': 'tom', 'name3': 'jerry', 'name4': 'tracy'} >>> person['name1'] = 'amy' >>> person {'name1': 'amy', 'name2': 'tom', 'name3': 'jerry', 'name4': 'tracy'}
-
键必须不可变,所以用数字,字符串或元组等充当,而列表不行,因为列表是可变的。
>>> person = {['name']:'bruce','age':24} Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list'
字典基本操作、内置函数及方法
len(dict)
,计算字典元素个数,即键值对的数量
>>> mydict = {1:"Python",2:"Java",3:"PHP"}
>>> len(mydict)
3
dict[key]
,返回字典dict
中键key
的值
>>> mydict[1]
'Python'
key in dict
,检查字典dict
中是否含有键为key
的项
>>> 1 in mydict
True
>>> 4 in mydict
False
dict.clear()
,删除字典内所有元素
>>> mydict.clear()
>>> len(mydict)
0
>>> mydict
{}
dict.copy()
返回一个字典的浅拷贝
>>> mydict = {1:"Python",2:"Java",3:"PHP"}
>>> a = mydict.copy()
>>> a
{1: 'Python', 2: 'Java', 3: 'PHP'}
>>> id(mydict)
140649544040952
>>> id(a)
140649536920672
# 注意如果字典的值是一个列表的话,此时再使用copy进行拷贝后,对新的对象改变该列表值的话,原字典也会受影响,这点在前面讲列表时已经详细说过,这里不再赘述,如不想原字典受影响可使用深拷贝
dict.fromkeys(seq[,value])
,创建一个新字典,以序列seq
中元素做字典的键,value
为字典所有键对应的初始值。
>>> seq = ('name','age','gender')
>>> d = dict.fromkeys(seq)
>>> d
{'name': None, 'age': None, 'gender': None}
>>> d = dict.fromkeys(seq,10)
>>> d
{'name': 10, 'age': 10, 'gender': 10}
dict.get(key,default=None)
,返回指定键的值,如果键不在字典中返回default
设置的默认值。
>>> d.get('age')
10
>>> d.get('email','None')
'None'
dict.setdefault(key,default=None)
,与get
方法类似,如果键不存在于字典中,返回设置的默认值,但不同的是,会将该键及默认值作为新的键/值对加入字典中。
>>> mydict = {1:'Python',2:'Java',3:'PHP'}
>>> mydict.setdefault(4,'C')
'C'
>>> mydict
{1: 'Python', 2: 'Java', 3: 'PHP', 4: 'C'}
dict.items()
,返回一个可迭代对象,形式为可遍历的键值对元组数组。
>>> a = mydict.items()
>>> a
dict_items([(1, 'Python'), (2, 'Java'), (3, 'PHP'), (4, 'C')])
dict.keys()
,返回一个可迭代对象,可以使用list()
来转换为列表。
>>> b = mydict.keys()
>>> b
dict_keys([1, 2, 3, 4])
>>> list(b)
[1, 2, 3, 4]
dict.values()
,返回一个可迭代对象,可以使用list()
来转换为列表,列表中的元素为字典中所有的值。
>>> c = mydict.values()
>>> c
dict_values(['Python', 'Java', 'PHP', 'C'])
>>> list(c)
['Python', 'Java', 'PHP', 'C']
dict.pop(key[,default])
,删除字典给定键key
所对应的值,返回值为被删除的值。key
必须给出,否则返回default
值。
>>> mydict.pop(4)
'C'
>>> mydict.pop(5,'None')
'None'
>>> mydict.pop(6)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 6
dict.popitem()
,随机返回并删除字典中的一对键值对。
>>> mydict = {1: 'Python', 2: 'Java', 3: 'PHP'}
>>> mydict.popitem()
(3, 'PHP')
>>> mydict
{1: 'Python', 2: 'Java'}
dict.update(dict2)
,把字典参数dict2
可key/value(键值对)
更新到字典dict
中。
>>> dict1 = {'name':'Tom','age':12}
>>> dict2 = {'gender':'man'}
>>> dict1.update(dict2)
>>> dict1
{'name': 'Tom', 'age': 12, 'gender': 'man'}
>>> dict3 = {'name':'Jerry'}
>>> dict1.update(dict3)
>>> dict1
{'name': 'Jerry', 'age': 12, 'gender': 'man'}