字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据。python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可哈希的。可哈希表示key必须是不可变类型,如:数字、字符串、元组。
字典(dictionary)是除列表意外python之中最灵活的内置数据结构类型。列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
二、增加字典元素的方法
▷list['key'] = vaule
这种方法是通过字典的kye给字典添加元素,如果字典里已存在该key的值,则会覆盖,如果不存在,则会添加,如下如:
1 dic = {'name':'fuyong','age':29,'job':'none'}
2
3 dic['addr'] = 'henan'
4 print(dic)
5 #输出结果为:{'age': 29, 'addr': 'henan', 'name': 'fuyong', 'job': 'none'}
6 dic['addr'] = 'xinyang'
7 print(dic)
8 #输出结果为:{'age': 29, 'addr': 'xinyang', 'name': 'fuyong', 'job': 'none'}
▷setdefault()方法:
此方法是根据函数对字典进行增添元素,参数为(‘key’,‘value’) value默认为none
与直接用 dict[key] = value 的添加元素方法不同,用setdefault(key,value)方法的时候,如果字典没有该key的时候,则会正常添加,如果以及有了该key,那么将不进行操作(不会覆盖原来的值)
1 dic = {'name':'fuyong','age':29,'job':'none'} 2 dic.setdefault('name','lixiang') 3 print(dic) #结果不会改变: {'age': 29, 'name': 'fuyong', 'job': 'none'} 4 5 dic.setdefault('height') 6 print(dic) #结果:{'age': 29, 'name': 'fuyong', 'height': None, 'job': 'none'} 7 8 dic.setdefault('addr','henan') 9 print(dic) #结果 {'addr': 'henan', 'age': 29, 'name': 'fuyong', 'height': None, 'job': 'none'}
三、删除字典元素的方法
▷pop(key)方法:
与列表的pop()方法不同,字典的pop()方法必须得给它传一个key值,如果字典里没有该key,则会报错。
也可以用 pop(key,'返回值') 来指定返回值,此时,当找不到key的时候,则不会报错,会将指定的返回值返回
1 dic = {'name':'fuyong','age':29,'job':'none'} 2 dic.pop('job') 3 print(dic) #结果为:{'age': 29, 'name': 'fuyong'} 4 5 dic.pop('job') 6 print(dic) #此时以及没有job的key,就会报错 KeyError: 'job'
print(dic.pop('addr','henan')) #此时虽然找不到‘addr’key,但是不会报错,并且将‘henan’返回
print(dic) #此时字典没有被改变 :{'name': 'fuyong', 'age': 29}
▷popitem()方法:
此方法类似于列表的pop()方法,用来随机删除一个元素,返回删除的那个元素的(健,值),如下:
1 dic = {'name':'fuyong','age':29,'job':'none'} 2 print(dic.popitem()) #结果为('name', 'fuyong') 3 print(dic) #结果为:{'job': 'none', 'age': 29}
▷del list[key]
此方法用来删除字典种指定key以及它所对应的value,如果找不到该key,则会报错,如下:
1 dic = {'name':'fuyong','age':29,'job':'none'} 2 del dic['job'] 3 print(dic) #结果为:{'age': 29, 'name': 'fuyong'} 4 5 del dic['job'] 6 print(dic) #此时字典里已经没有job值,则会报错:KeyError: 'job'
▷clear()方法:
该方法与列表的clear()方法类似,用来清空字典,如下:
1 dic = {'name':'fuyong','age':29,'job':'none'} 2 dic.clear() 3 print(dic) #结果为:{}
▷del dic
该方法用来删除整个字典,如下:
1 dic = {'name':'fuyong','age':29,'job':'none'} 2 del dic 3 print(dic) #此时dic已经被删除,不存在了,所以会报错:NameError: name 'dic' is not defined
四、修改字典元素的方法
▷list['key'] = vaule
这种方法是通过字典的kye来修改对应的value值,如果字典里已存在该key的值,则会修改,如果不存在,则会重新添加
1 dic = {'name':'fuyong','age':29,'job':'none'} 2 3 dic['addr'] = 'henan' #此时没有addr的key 则会添加 4 print(dic) 5 #输出结果为:{'age': 29, 'addr': 'henan', 'name': 'fuyong', 'job': 'none'} 6 7 dic['addr'] = 'xinyang' #此时以及有addr的key 则会修改 8 print(dic) 9 #输出结果为:{'age': 29, 'addr': 'xinyang', 'name': 'fuyong', 'job': 'none'}
▷update({key:value})方法:
该方法是用来追加、拓展原字典元素。
参数必须为一个字典,如下:
1 dic = {'name':'fuyong','age':29,'job':'none'} 2 dic.update({'addr':'henan'}) 3 print(dic) #结果为:{'job': 'none', 'addr': 'henan', 'age': 29, 'name': 'fuyong'}
如果传入的字典里有部分key与原字典相同,则该key所对应的值会被覆盖,其他没有的key则会被添加,如下:
1 dic = {'name':'fuyong','age':29,'job':'none'} 2 dic.update({'addr':'henan','name':'lixiang'}) 3 print(dic) 4 #结果为:{'addr': 'henan', 'name': 'lixiang', 'job': 'none', 'age': 29}
五、查询字典元素的方法
▷dic[key]
可以通过key来索引查询字典的元素,如果查不到,则会报错
1 dic = {'name':'fuyong','age':29,'job':'none'} 2 print(dic['name']) #结果为:fuyong 3 print(dic['addr']) #搜索不到,会报错。KeyError: 'addr'
▷get(key)方法:
该方法是用指定索引的方法来查找其所对应的元素,如果找不到,不会报错,可以通过 dic.get(key,'返回值') 方法指定找不到key时候的返回值,如下:
1 dic = {'name':'fuyong','age':29,'job':'none'} 2 print(dic.get('name')) #结果为:fuyong 3 print(dic.get('addr')) #结果为:none 4 print(dic.get('addr','找不到该数据')) #结果为:找不到该数据
6、用循环的方法来遍历字典:
▷keys()方法
此方法用来查询字典所有的key,可以用for循环进行遍历
1 dic = {'name':'fuyong','age':29,'job':'none'} 2 print(dic.keys()) 3 # 结果:dict_keys(['name', 'age', 'job']) 4 5 for key in dic.keys(): 6 print(key) 7 # 结果为: 8 # job 9 # name 10 # age
▷values()方法
此方法用来查询字典所有的values,可以用for循环进行遍历
1 dic = {'name':'fuyong','age':29,'job':'none'} 2 print(dic.values()) 3 # 结果:dict_values(['none', 29, 'fuyong']) 4 5 for value in dic.values(): 6 print(value) 7 # 结果为: 8 # none 9 # 29 10 # fuyong
▷items()方法
此方法用来查询字典所有 的键值,可以用for循环来遍历
1 dic = {'name':'fuyong','age':29,'job':'none'} 2 print(dic.items()) 3 # 结果:dict_items([('job', 'none'), ('name', 'fuyong'), ('age', 29)]) 4 5 for k,v in dic.items(): 6 print(k,v) 7 # 结果为: 8 # job none 9 # name fuyong 10 # age 29
7、作业练习
# ====================================作业================================= # 1,有如下变量(tu是个元祖),请实现要求的功能 tu = ("alex", [11, 22, {"k1": 'v1', "k2": ["age", "name"], "k3": (11,22,33)}, 44]) # a. 讲述元祖的特性 # 元组称为不可变的列表,元素里面的子元素不可以被修改,但是如果子元素为列表,那么列表的子元素是可以修改的 # b. 请问tu变量中的第一个元素 “alex” 是否可被修改? # 不可以 # c. 请问tu变量中的"k2"对应的值是什么类型?是否可以被修改?如果可以,请在其中添加一个元素 “Seven” # k2对应的元素为列表,可以被修改 tu[1][2]['k2'].append('Seven') # d. 请问tu变量中的"k3"对应的值是什么类型?是否可以被修改?如果可以,请在其中添加一个元素 “Seven” # k3所对应的值为元组,不可以被修改 # 2, 字典dic,dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]} dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]} # a. 请循环输出所有的key for key in dic.keys(): print(key) # b. 请循环输出所有的value for value in dic.values(): print(value) # c. 请循环输出所有的key和value for k,y in dic.items(): print(k,y) # d. 请在字典中添加一个键值对,"k4": "v4",输出添加后的字典 dic.update({'k4':'v4'}) print(dic) # e. 请在修改字典中 “k1” 对应的值为 “alex”,输出修改后的字典 dic['k1'] = 'alex' print(dic) # f. 请在k3对应的值中追加一个元素 44,输出修改后的字典 dic['k3'].append(44) # g. 请在k3对应的值的第 1 个位置插入个元素 18,输出修改后的字典 dic['k3'].insert(0,18) # # 3、元素分类 # 有如下值li= [11,22,33,44,55,66,77,88,99,90],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。 # 即: {'k1': 大于66的所有值列表, 'k2': 小于66的所有值列表} li= [11,22,33,44,55,66,77,88,99,90] dic1 = {'k1':[],'k2':[]} for i in li: if i > 66: dic1['k1'].append(i) if i <66: dic1['k2'].append(i) print(dic1) # # # 4、输出商品列表,用户输入序号,显示用户选中的商品 # 商品 li = ["手机", "电脑", '鼠标垫', '游艇'] # 要求:1:页面显示 序号 + 商品名称,如: # 1 手机 # 2 电脑 # … # 2: 用户输入选择的商品序号,然后打印商品名称 # 3:如果用户输入的商品序号有误,则提示输入有误,并重新输入。 # 4:用户输入Q或者q,退出程序。 ######################################################### li = ["手机", "电脑", '鼠标垫', '游艇'] count = 0 dic_shop = {} #将列表遍历然后一一添加到字典当中,对应的键值分别为1,2,3,4…… for i in li: count += 1 dic_shop.update({count:i}) #遍历显示字典的内容 for k,y in dic_shop.items(): print(k,y) #让用户输入商品序号,如果用户输入的商品序号有误,则提示输入有误,并重新输入。 while 1: user_key = input("请输入商品序号(输入Q或者q,退出程序)").strip() if user_key.upper() == 'Q': break elif user_key.isdigit() and 0 < int(user_key) <= len(dic_shop): print("您选择的商品为:",dic_shop.get(int(user_key))) else: print("输入有误,请重新输入") ##################################################################