day5 字典的基本操作
字典:
字典的基本概念:
字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据。python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可哈希的。可哈希表示key必须是不可变类型,如:数字、字符串、元组。
字典(dictionary)是除列表意外python之中最灵活的内置数据结构类型。列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过索引存取
1增:setdefault
dict = {'name': 'wangjifei','age':27,'hometown':'xingtai'} dict['job'] = 'IT'#有就覆盖,没有就添加 print(dict)#{'name': 'wangjifei', 'age': 27, 'hometown': 'xingtai', 'job': 'IT'} #setdefault 在字典中添加键值对,如果只有键那对应的值是none,但是如果原字典中存在设置的键值对,则他不会更改或者覆盖。 dict.setdefault('hometown','xingtai') print(dict)#{'name': 'wangjifei', 'age': 27, 'hometown': 'xingtai', 'job': 'IT'} dict.setdefault('name','gaoliang') print(dict)#{'name': 'wangjifei', 'age': 27, 'hometown': 'xingtai', 'job': 'IT'}
2、删:pop,popitem,clear,del
dict = {'name': 'wangjifei','age':27,'hometown':'xingtai'} s = dict.pop('age')#返回删除的value s2 = dict.pop('hobby','没有返回no')#若删除的键不存在,可以返回添加的任何信息,没有信息就报错 print(dict) print(s) print(s2)
dict.clear()#清空列表
dict = {'name': 'wangjifei','age':27,'hometown':'xingtai'} s1 = dict.popitem()# 随机删除字典中的某个键值对,将删除的键值对以元祖的形式返回 print(s1)#('hometown', 'xingtai') print(dict)#{'name': 'wangjifei', 'age': 27} del dict['name']#无返回值 del dict#删除整个字典
3、改:update
dict = {'name': 'wangjifei','age':27,'hometown':'xingtai'} dic = {'name':'gaoliang','hobby':'girl'} dict['name'] = 'gaoliang'#有则覆盖没有就添加 print(dict)#{'name': 'gaoliang', 'age': 27, 'hometown': 'xingtai'} dic = {'name':'gaoliang','hobby':'girl'} dict.update(dic)#两个字典的更新,将dic里面的所有键值对,覆盖添加到dict中,dic不变 print(dict)#{'name': 'gaoliang', 'age': 27, 'hometown': 'xingtai', 'hobby': 'girl'} print(dic)#{'name': 'gaoliang', 'hobby': 'girl'}
4、查:get;for循环,dict.keys--dict.values--dict.items
dict = {'name': 'wangjifei','age':27,'hometown':'xingtai'} print(dict['name'])#wangjifei#key值查找 print(dict.get('age'))#27 #内置函数查找,找到返回value。没有key就返回None print(dict.get('hobby','没有此键'))#没有此键 #key在字典里就返回对应的value,没有就返回添加的内容,没有添加内容就返回None
dict = {'name': 'wangjifei','age':27,'hometown':'xingtai'} print(dict.keys(),type(dict.keys())) print(dict.values(),type(dict.values())) print(dict.items(),type(dict.items()))
》》》
dict_keys(['name', 'age', 'hometown']) <class 'dict_keys'>
dict_values(['wangjifei', 27, 'xingtai']) <class 'dict_values'>
dict_items([('name', 'wangjifei'), ('age', 27), ('hometown', 'xingtai')]) <class 'dict_items'>
for循环遍历查找字典:
第一种:
dict = {'name': 'wangjifei','age':27,'hometown':'xingtai'} for i,v in dict.items(): print(i,v)
》》》
name wangjifei
age 27
hometown xingtai
第二种:
dict = {'name': 'wangjifei','age':27,'hometown':'xingtai'} for i in dict: print(i,dict[i])
》》》
name wangjifei
age 27
hometown xingtai
分别赋值法:
a,b = 1,3 print('a',a) print('b',b)
a,b = b, a print('a',a) print('b',b)
》》》
a 1
b 3
a 3
b 1
字典的copy(拷贝字典)
dict = { 'id1': {"name": "alex", "hobby_list": ["抽烟", "喝酒", "烫头", "Massage"]}, 'id2': {"name": "wusir", "hobby_list": ["喊麦", "街舞"]} } dict1 = dict.copy() print(dict) print(dict1)
》》》
{'id1': {'name': 'alex', 'hobby_list': ['抽烟', '喝酒', '烫头', 'Massage']}, 'id2': {'name': 'wusir', 'hobby_list': ['喊麦', '街舞']}}
{'id1': {'name': 'alex', 'hobby_list': ['抽烟', '喝酒', '烫头', 'Massage']}, 'id2': {'name': 'wusir', 'hobby_list': ['喊麦', '街舞']}}
fromkeys(指定一个列表,把列表中的值作为字典的key,生成一个字典)
list = ['s','r','t','n','m'] dict2 = dict.fromkeys(list) dict3 = dict.fromkeys(list,50) print(dict2) print(dict3)
》》》
{'s': None, 'r': None, 't': None, 'n': None, 'm': None}
{'s': 50, 'r': 50, 't': 50, 'n': 50, 'm': 50}
注意:fromkeys的误区
fromkeys迭代添加字典键值对时,如果自定义的值是列表的话,其实开辟的是一个内存地址,也就是说,接下来要在其中一个key中添加元素,其他key中也会添加上,就会导致不想遇到的结果,看不懂就看例子吧
dict1 = dict.fromkeys('abcdef',[])#创建的字典自定义添加[]元素 print(dict1) dict1['a'].append(555)#在字典中key是'a'中的列表里添加数字555,看结果 print(dict1)#结果意想不到吧
》》》
{'a': [], 'b': [], 'c': [], 'd': [], 'e': [], 'f': []}
{'a': [555], 'b': [555], 'c': [555], 'd': [555], 'e': [555], 'f': [555]}