字典:
(1)字典是python中的基本数据类型,能能够存储大量的关系型数据。
(2)字典是由“键:值”对的形式存储数据的,键与值是一对多的关系,键是唯一。
(3)字典也称为映射,是python中唯一的映射关系。
(4)字典的值是通过键来引用。
# 可变类型数据与不可变类型数据:
可变类型数据:又称为不可哈希的数据,例如:列表list,字典dict
不可变类型数据:又称为可哈希的数据,例如:字符串str,数字int,元组tuple
**** 字典的键必须是不可变类型的数据(通用使用字符串,数值作为键)*****
# 创建字典
方式一:直接创建
# 字典可以存储任意数目的数据类型
info = { 'name':'hesihao', 'age':23, 'city':'guangzhou', 'book':{'name':'python', 'price':80} }
方式二:dict()工厂函数
dic = dict({'name':'he','age':23})
print(dic)
>>>
{'name':'he','age':23}
方式三: fromkeys(iterable,value)
dic = dict.fromkeys([1,2,3],'he')
print(dic)
>>>
{1: 'he', 2: 'he', 3: 'he'}
#####知识点:fromkeys的陷进########
dic1 = dict.fromkeys([1,2,3],[])
print(dic1)
>>>{1: [], 2: [], 3: []}
dic1[1].append('alex')
print(dic1)
>>>{1: ['alex'], 2: ['alex'], 3: ['alex']}
print(id(dic1[1]))
print(id(dic1[2]))
print(id(dic1[3]))
>>>
1823385461640
1823385461640
1823385461640
总结:通过fromkeys()的默认值如果是一个[]空列表的话,这个列表是共用的,对列表进行操作,会影响到其他键值对。。。
# 字典的具体操作
(1)增
#两种方法:
第一种:字典['键'] = 值,若有此键就修改,如果没有就添加。
第二种:setdefault(k,d=None), 若有这个键就不变,没有这个键就添加(可以设置默认值)
'''第一种:‘字典['键'] = 值’ 若有这个键就修改,否则就添加'' info = { 'name':'he', 'age':23, 'city':'guangzhou', } # sex这个键不存在,所以会添加新的键值对 info['sex'] = 'male' print(info) >>>{'name': 'he', 'age': 23, 'city': 'guangzhou', 'sex': 'male'} # age这个键已经存在,所以会修改其对应的值 info['age'] = 18 print(info) >>>{'name': 'he', 'age': 18, 'city': 'guangzhou', 'sex': 'male'}
'''第二种:setdefault(k,d=None) 若有这个键就不变,没有这个键就添加(可设置默认值) ''' info = { 'name':'he', 'age':23, 'city':'guangzhou', } # sex这个键不存在,所以添加,并且返回对应的值 new_value=info.setdefault('sex','male') print(info) print(new_value) >>>{'name': 'he', 'age': 23, 'city': 'guangzhou', 'sex': 'male'} >>>male #字典中有此key,不做任何操作,但会返回此键对应的值!!!! new_value = info.setdefault('name','sitian') print(info) print(new_value) >>>{'name': 'he', 'age': 23, 'city': 'guangzhou'} >>>he
(2) 删
第一种方法:del语句
del dict[key] : 删除对应的键值对,如果键不存在会报错。
del dict : 在内存级别删除整个字典。
info = { 'name':'he', 'age':23, 'city':'guangzhou', } # 键存在,则删除对应的键值对 del info['city'] print(info) >>>{'name': 'he', 'age': 23} #若键不存在,则会报错 del info['book'] print(info) >>> KeyError: 'book' #在内存级别,删除整个列表 del info
第二种方法:
'''pop(k,None):通过键去删除键值对,也有返回值;如果键不存在,会报错(添加None参数解决)'''
info = { 'name':'hesihao', 'age':23, 'city':'guangzhou', 'book':{'name':'python', 'price':80} } # 键存在,会删除并返回被删除的元素 res = info.pop('book') print(res) print(info) >>> male >>>{'name': 'hesihao', 'age': 23, 'city': 'guangzhou'} # 如果键不存在,则会报错 res = info.pop('job') print(res) print(info) >>>KeyError: 'job' #上面的报错,可以通过设置默认值来解决,若键不存在,则返回指定的值 re1 = info.pop('name1','没有此键') #没有此键,但是默认值时,会返回默认值。 print(re1) >>>没有此键
第三种方法:
'''clear():清空字典键值对,单保留自己本身'''
dic = {'name':'hesihao','age':23} dic.clear() print(dic) >>>{}
第四种方法:
'''popitem(): 3.5以前的版本随机删除某个键值对,并返回。3.6版本默认删除最后一个元素并返回,意义不大'''
dic = {'name':'hesihao','age':23} res = dic.popitem() print(res,type(res)) #返回元组,元组第一个元素为键,第二个元素为值
(3)改
第一种方法:通过 dict[key] = value,如果key存在,则修改其对应值
info = { 'name':'hesihao', 'age':23, 'city':'guangzhou', 'sex' : 'male' } info['city'] = 'shenzhen' print(info) >>>{'name': 'hesihao', 'age': 23, 'city': 'shenzhen', 'sex': 'male'}
第二种方法:update()
dic = {'name':'he','age':23} dic.update(city='guangzhou',job='python') #通过key=value的形式,把键值对追加到字典中 print(dic) #对于两个字典:将dic2中的所有键值对覆盖并添加到dic1中 dic1 = {'name':'jin','age':'18','sex':'male'} dic2 = {'name':'alex','weight':75} dic1.update(dic2) print(dic1) print(dic2) >>> {'name': 'alex', 'age': '18', 'sex': 'male', 'weight': 75} {'name': 'alex', 'weight': 75}
(4) 查
第一种方法:dict[key] ---> value
info = { 'name':'hesihao', 'age':23, 'city':'guangzhou', 'sex' : 'male' } print(info['name']) print(info['age'])
第二种方法:get()方法
#1.如果有对应的值,返回value info = { 'name':'he', 'age':23, 'city':'guangzhou', 'sex' : 'male' } print(info.get('name')) >>>he #2.如果没有对应的值,返回None,不会报错 res = info.get('job') print(res) >>>None #3.可以设置默认的返回值:dict.get(key,default) res = info.get('job','python') print(res) >>> python
第三种方法:遍历字典
(1) dict.keys()---->返回字典的所有键
(2) dict.values() -----> 返回字典的所有值
(3) dict.items()----->返回所有键值对
info = { 'name':'hesihao', 'age':23, 'city':'guangzhou', 'book':{'name':'python', 'price':80} } key_list = [ key for key in info.keys()] print(key_list) value_list = [ value for value in info.values()] print(value_list) for k,v in info.items(): print(f'Key:{k}') print(f'Value:{v}')
# 补充知识点:
题目一: dic = {'key1':'value1','key2':'value2','k3':'v3','name':'alex'},把含有"k"的键删除。
dic = {'key1':'value1','key2':'value2','k3':'v3','name':'alex'} for i in dic.keys(): if 'k' in i: del dic[i] print(dic) >>> RuntimeError: dictionary changed size during iteration
-----为什么会报错呢?有过列表的经验,我们应该很快就能定位到问题。在循环中修改字典,字典就会相对应的发生了变化----------
# 谨记:在循环一个字典时,不能改变字典的大小
# 思路:可以在循环一个其他数据类型的时,对字典进行修改
# 方式一:
dic = {'key1':'value1','key2':'value2','k3':'v3','name':'alex'}
dic1 = {}
for i in dic.keys(): #['key1','key2','k3']
if 'k' not in i:
dic1[i] = dic[i]
dic = dic1
print(dic1)
#方式二:可以循环列表中,修改字典,这样就不会影响了
lst =[]
for key in dic:
if 'k' in key:
lst.append(key)
for key in lst:
dic.pop(key)
print(dic)
# 在观察一下,上面的low写法,其实可以改变一下:
dic = {'key1':'value1','key2':'value2','k3':'v3','name':'alex'} for i in list[dic.keys()]: # 把dic.keys()转化为一个列表,这样就可以i循环的元素固定下来 if 'k' in i: del dic[i] print(dic)