字典是许多数据的集合,属于可变序列类型,它是无序的可变序列,其保存的内容是以“键值对”的形式存放的。
Python 中,字典的数据类型为 dict,通过 type() 函数即可查看。
字典类型所具有的主要特征:
(1)通过键而不是通过索引来读取元素。
(2)字典是任意数据类型的无序集合。
(3)字典是可变的,并且可以任意嵌套。
(4)字典中的键必须唯一。
(5)字典中的键必须不可变,因此只能使用数字、字符串或者元组,不能使用列表。
======创建字典======
1.赋值创建
Python 字典类型的语法格式如下:
dictname = {'key':'value1','key2':'value2',...,'keyn':valuen}
其中 dictname 表示字典类型名,keyn : valuen 表示各个元素的键值对。需要注意的是,同一字典中各个元素的键值必须唯一。
示例:
adict = {'a':1,'b':2,'c':3}
print(adict)
bdict = {}
print(bdict)
cdict = {(1,2):'good','bad':[1,2]}
print(cdict)结果:
{'a': 1, 'b': 2, 'c': 3}
{}
{(1, 2): 'good', 'bad': [1, 2]}
2.通过fromkeys()方法创建
Python 中,还可以使用 dict 字典类型提供的 fromkeys() 方法创建所有键值为空的字典,使用此方法的语法格式为:
dictname = dict.fromkeys(list,value=None)
其中,list 参数表示字典中所有键的列表,value 参数默认为 None,表示所有键对应的值。此种创建方式,通常用于初始化字典,设置 value 的默认值。
示例:
ddict = {"a":1,'b':2}
edict = dict.fromkeys(ddict)
print(edict)结果:
{'a': None, 'b': None}
3.通过dict()映射函数创建
fdict = dict(a=1,b=2,c=3) #使用此方式创建字典时,字符串不能带引号
print(fdict)
gdict = [['a',1],['b',2]] #向 dict() 函数传入列表或元组,其中元素是包含 2 个元素的列表或元组,其中第一个为键,第二个为值。
print(dict(gdict))
hdict =[(1,2),(3,4),(5,6)]
print(dict(hdict))
idict =((1,2),(3,4),(5,6))
print(dict(idict))
jdict =([1,2],[3,4],[5,6])
print(dict(jdict))
akeys = ['a','b','c'] #通过dict() 函数和 zip() 函数可将前两个列表转换为对应的字典。akeys和avalues还可以是字符串或元组
avalues = [1,2,3]
print(dict(zip(akeys,avalues)))结果:
{'a': 1, 'b': 2, 'c': 3}
{'a': 1, 'b': 2}
{1: 2, 3: 4, 5: 6}
{1: 2, 3: 4, 5: 6}
{1: 2, 3: 4, 5: 6}
{'a': 1, 'b': 2, 'c': 3}
注意,无论采用以上哪种方式创建字典,字典中各元素的键都只能是字符串、元组或数字,不能是列表。
====访问字典=====
1.通过键来访问
akeys = ['a','b','c']
avalues = [1,2,3]
adict = dict(zip(akeys,avalues))
print(adict['c'])结果:
3
2.通过get() 方法获取指定键的值
get() 方法的语法格式为:
dict.get(key[,default])
其中,dict 指的是所创建的字典名称;key 表示指定的键;default 用于指定要查询的键不存在时,此方法返回的默认值,如果不手动指定,会返回 None。
示例:
adict = dict(a=1,b=2,c=3)
print(adict.get('a'))print(adict.get('d')) #指定的键不存在,会返回None
print(adict.get('e','No this key')) #指定的键不存在,但会返回一个提示信息结果:
1
None
No this key
=====删除字典=====
和删除列表、元组一样,手动删除字典也可以使用 del 语句。
adict = dict(a=1,b=2,c=3)
del(adict)
print(adict)结果:
NameError: name 'adict' is not defined
====添加键值对====
如果要为 dict 添加键值对,只需为不存在的 key 赋值即可。实现此操作的语法格式如下:
dictname[key] = value
示例 :
adict = {}
adict['a'] = 1
adict['b'] = 2
adict['c'] = 3
print(adict)结果:
{'a': 1, 'b': 2, 'c': 3}
=====修改键值对========
“修改键值对”并不是同时修改某一键值对的键和值,而只是修改某一键值对中的值。
由于在字典中,各元素的键必须是唯一的,因此,如果新添加元素的键与已存在元素的键相同,原来键所对应的值就会被新的值替换掉。例如:
adict = dict(a=1,b=2,c=3)
adict['a'] = 111
print(adict)结果:
{'a': 111, 'b': 2, 'c': 3}
====删除键值对======
如果要删除字典中的键值对,还是可以使用 del 语句。例如:
adict = dict(a=1,b=2,c=3)
del adict['c']
print(adict)结果:
{'a': 1, 'b': 2}
====判断键值对是否存在======
如果要判断字典中是否存在指定键值对,首先应判断字典中是否有对应的键。判断字典是否包含指定键值对的键,可以使用 in 或 not in 运算符。对于 dict 而言,in 或 not in 运算符都是基于 key 来判断的。
adict = dict(a=1,b=2,c=3)
print('a' in adict)
print('a' not in adict)结果:
True
False
====键值对操作方法======
1.keys()、values() 和 items()方法
这 3 个方法之所以放在一起介绍,是因为它们都用来获取字典中的特定数据。keys() 方法用于返回字典中的所有键;values() 方法用于返回字典中所有键对应的值;items() 用于返回字典中所有的键值对。
adict = dict(a=1,b=2,c=3)
print(adict.keys())
print(adict.values())
print(adict.items())结果:
dict_keys(['a', 'b', 'c'])
dict_values([1, 2, 3])
dict_items([('a', 1), ('b', 2), ('c', 3)])
注意:在 Python 2.x 中,这三个方法的返回值是列表类型。但在 Python 3 中,并不是列表和元组类型,因为 Python 3不希望用户直接操作这几个方法的返回值。如果想使用返回的数据,有以下 2 种方法:
(1)使用 list() 函数,将它们返回的数据转换成列表,例如:
adict = dict(a=1,b=2,c=3)
print(list(adict.keys()))
print(list(adict.values()))
print(list(adict.items()))结果:
['a', 'b', 'c']
[1, 2, 3]
[('a', 1), ('b', 2), ('c', 3)]
(2)利用多重赋值的技巧,利用循环结构将键或值分别赋给不同的变量,例如:
adict = dict(a=1,b=2,c=3)
for i in adict.keys():
print(i,end= ' ')
print()
for j in adict.values():
print(j,end=' ')
print()
for k,v in adict.items():
print("key:%s"% k,"value:%s"% v)结果:
a b c
1 2 3
key:a value:1
key:b value:2
key:c value:3
2.copy()方法
copy() 方法用于返回一个具有相同键值对的新字典,例如:
adict = dict(a=1,b=2,c=3)
cdict = adict.copy()
print(cdict)结果:
{'a': 1, 'b': 2, 'c': 3}
注意,copy() 方法所遵循的拷贝原理,既有深拷贝,也有浅拷贝。拿拷贝字典 a 为例,copy() 方法只会对最表层的键值对进行深拷贝,也就是说,它会再申请一块内存用来存放 {'one': 1, 'two': 2, 'three': []};而对于某些列表类型的值来说,此方法对其做的是浅拷贝,也就是说,b 中的 [1,2,3] 的值不是自己独有,而是和 a 共有。
a = {'a':1,'b':2,'c':[1,2,3]}
b = a.copy()
a['a'] = 111
print(a)
print(b)
a['d'] = 4
print(a)
print(b)
a['c'].remove(1)
print(a)
print(b)结果:
{'a': 111, 'b': 2, 'c': [1, 2, 3]}
{'a': 1, 'b': 2, 'c': [1, 2, 3]}
{'a': 111, 'b': 2, 'c': [1, 2, 3], 'd': 4}
{'a': 1, 'b': 2, 'c': [1, 2, 3]}
{'a': 111, 'b': 2, 'c': [2, 3], 'd': 4}
{'a': 1, 'b': 2, 'c': [2, 3]}
从运行结果不难看出,对 a 增加新键值对,b 不变;而修改 a 某键值对中列表内的元素,b也会相应改变。
3.update()方法
在执行 update() 方法时,如果被更新的字典中己包含对应的键值对,那么原 value 会被覆盖;如果被更新的字典中不包含对应的键值对,则该键值对被添加进去。
a = {'a':1,'b':2,'c':[1,2,3]}
a.update({'a':111,'b':222,'e':444})
print(a)结果:
{'a': 111, 'b': 222, 'c': [1, 2, 3], 'e': 444}
4.pop()方法
pop() 方法用于获取指定 key 对应的 value,并删除这个键值对。
a = {'a':1,'b':2,'c':[1,2,3]}
a.pop('a')
print(a)结果:
{'b': 222, 'c': [1, 2, 3]}
5.popitem()方法
popitem() 方法用于随机弹出字典中的一个键值对。
注意,此处的随机其实是假的,它和 list.pop() 方法一样,也是弹出字典中最后一个键值对。但由于字典存储键值对的顺序是不可知的,因此 popitem() 方法总是弹出底层存储的最后一个键值对。
a = {'a':1,'b':2,'c':[1,2,3]}
print(a)
k,v = a.popitem() #将弹出项的key赋值给k、value赋值给v
print(k,v)结果:
{'a': 1, 'b': 2, 'c': [1, 2, 3]}
c [1, 2, 3]
6.setdefault()方法
setdefault() 方法总能返回指定 key 对应的 value;如果该键值对存在,则直接返回该 key 对应的 value;如果该键值对不存在,则先为该 key 设置默认的 value,然后再返回该 key 对应的 value。
a = {'a':1,'b':2,'c':[1,2,3]}
print(a)
print(a.setdefault('a',444)) #键存在,则不会修改value
print(a.setdefault('e',444)) #键不存在,则新增键值对
print(a)结果:
{'a': 1, 'b': 2, 'c': [1, 2, 3]}
1
444
{'a': 1, 'b': 2, 'c': [1, 2, 3], 'e': 444}
====使用字典格式化字符串=======
temp = 'name:%(name)s,price:%(price)d,'
book = {'name':'python','price':120}
print(temp % book)结果:
name:python,price:120