1.字典
1)定义:查找速度快,效率高;用{}括起来,内部使用key:value的形式来保存数据;键值对是无序的,不是按照定义的方式保存数据的(类似于json文件),
例如: {'jay':'周杰伦','jj'::'林俊杰'}
注:字典的key必须是可哈希的(先将key通过hash算法转化成一个hash值,再通过hash值直接找到值),不可变的;而对于value是没有限制的
#如下字典为错误定义:
dic = {"cat":"小猫","dog":"小狗",["fruit"]:"apple"} print(dic) 报错: TypeError: unhashable type: 'list'
2)字典的增加
①普通增加
dic = {"cat":"小猫","dog":"小狗"} dic["pig"]="小猪佩奇" print(dic) 输出: {'pig': '小猪佩奇', 'dog': '小狗', 'cat': '小猫'}
注:如果key存在了会替换掉原来的数据
dic = {"cat":"小猫","dog":"小狗"} dic["pig"]="小猪佩奇" dic["pig"]="小猪乔治" print(dic) 输出: {'dog': '小狗', 'cat': '小猫', 'pig': '小猪乔治'}
②通过函数setdefault对字典进行增加
dic = {"cat":"小猫","dog":"小狗"} dic["pig"]="小猪佩奇" dic.setdefault("panda","小熊猫") print(dic) 输出: {'dog': '小狗', 'panda': '小熊猫', 'cat': '小猫', 'pig': '小猪佩奇'}
注:通过函数setdefault()添加,如果字典中已经包含了这个key,那么不再往字典中继续保存新的值,还是原来的值
dic = {"cat":"小猫","dog":"小狗"} dic["pig"]="小猪佩奇" dic.setdefault("panda","小熊猫") dic.setdefault("panda","中华大熊猫") print(dic) 输出: {'pig': '小猪佩奇', 'cat': '小猫', 'panda': '小熊猫', 'dog': '小狗'}
3)字典的删除
①通过pop用key去删除数据(删除一个字典元素,返回字典的value值)
dic = {"cat":"小猫","dog":"小狗"} dic["pig"]="小猪佩奇" res = dic.pop("dog") print(res) print(dic) 输出: 小狗 {'cat': '小猫', 'pig': '小猪佩奇'}
②通过del删除字典中的元素
dic = {"cat":"小猫","dog":"小狗"} dic["pig"]="小猪佩奇" del dic["cat"] print(dic) 输出: {'dog': '小狗', 'pig': '小猪佩奇'}
③通过popitem随机删除字典中的元素(会返回一个元组)
dic = {"cat":"小猫","dog":"小狗"} dic["pig"]="小猪佩奇" res = dic.popitem() print(res) print(dic) 输出: ('cat', '小猫') {'pig': '小猪佩奇', 'dog': '小狗'}
④清空字典中的所有元素
dic = {"cat":"小猫","dog":"小狗"} dic["pig"]="小猪佩奇" dic.clear() print(dic) 输出: {}
4)字典的修改
①将字典一中的内容更新到字典二中,如果key重名,则进行替换,如果key值不存在,进行新增
dic_1 = {"cat":"小猫","dog":"小狗"} dic_2 = {"pig":"小猪","panda":"小熊猫","cat":"大花猫"} dic_1.update(dic_2) print(dic_1) print(dic_2) 输出: {'dog': '小狗', 'panda': '小熊猫', 'cat': '大花猫', 'pig': '小猪'} {'panda': '小熊猫', 'cat': '大花猫', 'pig': '小猪'}
例:对key的值进行修改
dic = {'id':1,'name':"马云",'money':10000000} dic['money'] = dic['money'] - 500000 print(dic) 输出: {'money': 9500000, 'name': '马云', 'id': 1}
5)字典元素的查找
①按照[],通过key取值 ( []中的值就类似于索引 );通过该方法查值,如果字典中的key不存在,就会报错
dic_2 = {"pig":"小猪","panda":"小熊猫","cat":"大花猫"} print(dic_2['panda']) 输出: 小熊猫
②通过get方法,通过key取值;如果key不存在,则返回None
dic_2 = {"pig":"小猪","panda":"小熊猫","cat":"大花猫"} print(dic_2.get("pig")) print(dic_2.get("dog")) 输出: 小猪 None
#通过get获取值时,如果字典中key值不存在,返回None,可以设定一个默认值,当key值不存在时返回一个默认值
dic = {"pig":"小猪","panda":"小熊猫","cat":"大花猫"} print(dic.get("dog","不存在")) 输出: 不存在
③通过setdefault获取字典中对应key的值
注:setdefault首先判断原来字典中有没有key,如果没有,则执行新增;其次用这个key去字典中查询,返回查到的结果
dic = {"pig":"小猪","panda":"小熊猫","cat":"大花猫"} print(dic.setdefault("panda")) 输出: 小熊猫
#获取setdefault存入的值
dic = {"pig":"小猪","panda":"小熊猫","cat":"大花猫"} res = dic.setdefault('dog',"小奶狗") print(res) print(dic) 输出: 小奶狗 {'panda': '小熊猫', 'dog': '小奶狗', 'pig': '小猪', 'cat': '大花猫'}
#如果原来的字典中,存在这个key,则直接返回原来的值
dic = {"pig":"小猪","panda":"小熊猫","cat":"大花猫"} res = dic.setdefault('panda',"大大大大熊猫") print(res) print(dic) 输出: 小熊猫 {'panda': '小熊猫', 'cat': '大花猫', 'pig': '小猪'}
6)字典的相关操作
①返回字典中所有的key(返回key的集合,像是列表,但是不是列表,也可以进行迭代循环)
dic = {"pig":"小猪","panda":"小熊猫","cat":"大花猫"} print(dic.keys()) for i in dic.keys(): print(i) 输出: dict_keys(['pig', 'cat', 'panda']) pig cat panda
②返回字典中所有的值(像是列表,但是不是列表,也可以进行迭代循环)
dic = {"pig":"小猪","panda":"小熊猫","cat":"大花猫"} print(dic.values()) for i in dic.values(): print(i) 输出: dict_values(['小猪', '小熊猫', '大花猫']) 小猪 小熊猫 大花猫
③获取所有的键值对(每一项都是一个元组)
dic = {"pig":"小猪","panda":"小熊猫","cat":"大花猫"} print(dic.items()) for i in dic.items(): print(i) 输出: dict_items([('pig', '小猪'), ('cat', '大花猫'), ('panda', '小熊猫')]) ('pig', '小猪') ('cat', '大花猫') ('panda', '小熊猫')
#通过元组的索引分别获取key和values的值
dic = {"pig":"小猪","panda":"小熊猫","cat":"大花猫"} print(dic.items()) for i in dic.items(): print(i[0]) #获取key print(i[1]) #获取values 输出: dict_items([('cat', '大花猫'), ('pig', '小猪'), ('panda', '小熊猫')]) cat 大花猫 小猪 panda 小熊猫
2.解构/解包:
把元组中每一个元素拿出来,赋值给前面的变量,这种方式叫做解包(列表也适用)
a,b = 1,2 a,b = (1,2) a,b = [1,2]
#例1
a,b = (1,2) print(a,b) 输出: 1 2
#例2
a,b,c = ('古力娜扎','马儿扎哈','迪丽热巴') print(b) 输出: 马儿扎哈
#通过解构的方式,遍历items中的key和values
dic = {"pig":"小猪","panda":"小熊猫","cat":"大花猫"} print(dic.items()) for item in dic.items(): k,v = item print(k,v) 输出: dict_items([('panda', '小熊猫'), ('pig', '小猪'), ('cat', '大花猫')]) panda 小熊猫 pig 小猪 cat 大花猫
#解构进阶
dic = {"pig":"小猪","panda":"小熊猫","cat":"大花猫"} print(dic.items()) for k,v in dic.items(): print(k,v) 输出: dict_items([('pig', '小猪'), ('panda', '小熊猫'), ('cat', '大花猫')]) pig 小猪 panda 小熊猫 cat 大花猫
总结:
1)keys:获取到字典中所有的key,然后存在一个高仿列表中
2)values:获取到字典中所有的value,然后存在一个高仿的列表中
3)items:获取到所有的键值对,以元组的形式存放在高仿的列表中
3.字典的嵌套
#字典嵌套取值练习
dic = { 'name':"阿狸", 'age':"18", 'nickname':"九尾妖狐", 'skill': { 'q':"欺诈宝珠", 'w':"妖异狐火", 'e':"魅惑妖术", 'r':"灵魂突袭" }, 'hoby':['包子','猴子'] } print(dic["skill"]["r"]) print(dic["hoby"][1]) 输出: 灵魂突袭 猴子
4.练习
1)有字符串"k:1|k1:2|k2:3|k3:4"处理成字典{'k':1,'k2':2….}
s = "k:1|k1:2|k2:3|k3:4" s_new = s.split("|") print(s_new) dic = {} for i in s_new: k,v = i.split(":") dic[k] = int(v) print(dic) 输出: ['k:1', 'k1:2', 'k2:3', 'k3:4'] {'k3': 4, 'k1': 2, 'k2': 3, 'k': 1}
2)按照如下需求处理列表
①页面显示: 序号 + 商品名称 + 商品价格,如: 1 电脑 1999 2 鼠标 10 .。。 ②用户输入选择的商品序号,然后打印商品名称及商品价格 ③如果用户输入的商品序号有误,则提示输入有误,并重新输入 ④用户输入Q或者q,退出程序 ⑤列表如下: goods = [{'name':"电脑",'price':1999},{'name':"鼠标",'price':10},{'name':"游艇",'price':20},{'name':"美女",'price':998},]
#步骤1
goods = [{'name':"电脑",'price':1999}, {'name':"鼠标",'price':10}, {'name':"游艇",'price':20}, {'name':"美女",'price':998},] for i in goods: print(goods.index(i),i['name'],i['price']) #doods.index(i) 先获取到列表中元素的下标 输出: 1 电脑 1999 2 鼠标 10 3 游艇 20 4 美女 998
#步骤2
goods = [{'name':"电脑",'price':1999}, {'name':"鼠标",'price':10}, {'name':"游艇",'price':20}, {'name':"美女",'price':998},] while 1: for i in goods: print(goods.index(i)+1,i['name'],i['price']) #doods.index(i) 先获取到列表中元素的下标 str_input = input("请输入你要选择的序号,按Q/q退出:") if str_input.isdigit() and int(str_input) > 0 and int(str_input) < len(goods): i_index = int(str_input) -1 print(goods[i_index]['name'],goods[i_index]['price']) elif str_input.upper() == "Q": break else: print("输入有误,请重新输入")