一、dict
key-value中储存大量的数据,属于关系型数据,用二分法查找,查找速度快。
dic = {
'name':'老男孩',
'age':17,
'name_list':[杰哥 民歌 花心哥 狗友 芳芳 恒富 ],
1:True.
.....
}
数据类型分类:
可变数据类型(不可哈希):list,dict,set。
不可变数据类型(可哈希):int,str,bool,tuple
字典的键:不可变数据类型
字典的值:任意数据类型
容器类型:
容器类(承载各种数据类型):list,tuple,dict
字典的键是唯一的。
字典的顺序:
3.5之前,字典是无序的。
3.6开始,字典创建的时候,按照一定的顺序插入的数值,看起来是有序的。
print(hash('name'))
print(hash('aadfasdfdsfsd'))
print(hash('age'))
print(hash(123))
生成一个哈希表,在表中可哈希数值对应表中一个值,可以按照顺序排列
# 增 dic = {"name":"jin", "age":18, "sex":"male", } # 第一种,有则覆盖,无则添加 dic['hobby'] = "girl" print(dic) #{'name': 'jin', 'age': 18, 'sex': 'male', 'hobby': 'girl'} dic["name"] = 'alex' print(dic) #{'name': 'alex', 'age': 18, 'sex': 'male', 'hobby': 'girl'} # 第二种,setfault添加一个键值对,有则添加,无则不变。 dic.setdefault('name','sb') print(dic) #{'sex': 'male', 'age': 18, 'name': 'alex', 'hobby': 'girl'} dic.setdefault('sb','sb') print(dic) #{'sb': 'sb', 'age': 18, 'hobby': 'girl', 'name': 'alex', 'sex': 'male'} # 删 # pop 有返回值的删除 print(dic.pop('sb')) #sb print(dic) #{'name': 'alex', 'age': 18, 'sex': 'male', 'hobby': 'girl'} print(dic.pop('hobby')) #girl print(dic) #{'sex': 'male', 'name': 'alex', 'age': 18} print(dic.pop('a',11)) #如果删除内容不存在后面可以加个返回值结果是11 print(dic) #{'age': 18, 'sex': 'male', 'name': 'alex'} print(dic.pop('age',65)) #有要删除内容,返回删除内容 18 print(dic) #{'sex': 'male', 'name': 'alex'} # clear 清空 dic.clear() print(dic) #{} # del 删除列表,按键值删除键值对 # del dic #删除字典 # print(dic) #报错,字典不存在了 dic = {"name":"jin", "age":18, "sex":"male", } del dic['name'] print(dic) #{'sex': 'male', 'age': 18} print(dic.popitem()) #随机删除,有返回值,返回的是删的内容 ('sex', 'male') print(dic) #{'age': 18} # 改 # 直接修改 dic = {"name":"jin", "age":18, "sex":"male", } dic['name'] = 'sb' print(dic) #{'age': 18, 'sex': 'male', 'name': 'sb'} # 两个字典的改 dic = {"name":"jin","age":18,"sex":"male"} dic2 = {"name":"alex","weight":75} dic2.update(dic) #对dic2进行升级,把dic内容覆盖到dic2中 print(dic2) #{'weight': 75, 'age': 18, 'sex': 'male', 'name': 'jin'} print(dic) #{'sex': 'male', 'age': 18, 'name': 'jin'} # 查 # 直接查找,如果不存在会报错,推荐用get查找 print(dic["name"]) #jin # print(dic['sb']) #报错 print(dic.get('name')) #jin print(dic.get('sb')) #None 默认返回None print(dic.get('sb','123344sdafasd')) #123344sdafasd 可以后面定义返回值 # 其他方法 # key() values() items() print(dic.keys(),type(dic.keys())) #dict_keys(['sex', 'name', 'age']) <class 'dict_keys'> # 把键放在了一个类似列表的容器中,可循环,可转化为列表 for i in dic.keys(): print(i) # name # sex # age # 把键值放在了一个类似列表的容器中,可循环,可转化为列表 for i in dic.values(): print(i) # 18 # jin # male # 把键值对放在了一个类似列表的容器中,可循环,可转化为列表 for i in dic.items(): print(i) # ('age', 18) # ('name', 'jin') # ('sex', 'male') # 特殊类型 dict 转化成list print(list(dic.keys())) #['sex', 'age', 'name'] #概念:分别赋值 a,b = 2,3 print(a,b) #2 3 c,d = (2,3) print(c,d) #2 3 e,f = [2,3] print(e,f) #2 3 # a = 4 b = 5转换成a = 5 b = 4,用一行代码实现 a = 4;b =5 a,b = b,a print(a,b) #5 4 for k,v in dic.items(): print(k,v) # name jin # age 18 # sex male
二、练习题
1,有如下变量(tu是个元祖),请实现要求的功能
tu = ("alex", [11, 22, {"k1": 'v1', "k2": ["age", "name"], "k3": (11,22,33)}, 44])
a. 讲述元祖的特性
b. 请问tu变量中的第一个元素 “alex” 是否可被修改?
c. 请问tu变量中的"k2"对应的值是什么类型?是否可以被修改?如果可以,请在其中添加一个元素 “Seven”
d. 请问tu变量中的"k3"对应的值是什么类型?是否可以被修改?如果可以,请在其中添加一个元素 “Seven”
# 1 # a.元组本身不可修改,但元组嵌套的其他数据类型可以被修改 # b.alex不可以修改 # c.'k2'对应的值是列表,可以修改 tu = ("alex", [11, 22, {"k1": 'v1', "k2": ["age", "name"], "k3": (11,22,33)}, 44]) tu[1][2]['k2'].append('Seven') print(tu) # d 'k3'对应的值是元组,不可以被修改
2, 字典dic,dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]}
a. 请循环输出所有的key
b. 请循环输出所有的value
c. 请循环输出所有的key和value
d. 请在字典中添加一个键值对,"k4": "v4",输出添加后的字典
e. 请在修改字典中 “k1” 对应的值为 “alex”,输出修改后的字典
f. 请在k3对应的值中追加一个元素 44,输出修改后的字典
g. 请在k3对应的值的第 1 个位置插入个元素 18,输出修改后的字典
# 2 dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]} # a for i in dic: print(i) # b for i in dic.values(): print(i) # c for i in dic.items(): print(i) # d dic.setdefault('k4,v4') print(dic) # e dic['k1'] = 'alex' print(dic) # f dic['k3'].append(44) print(dic) # g dic['k3'].insert(0,18) print(dic)
3,av_catalog = {
"欧美":{
"www.youporn.com": ["很多免费的,世界最大的","质量一般"],
"www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"],
"letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"],
"x-art.com":["质量很高,真的很高","全部收费,屌丝请绕过"]
},
"日韩":{
"tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","verygood"]
},
"大陆":{
"1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
}
}
# 1,给此 ["很多免费的,世界最大的","质量一般"]列表第二个位置插入一个元素:'量很大'。
# 2,将此 ["质量很高,真的很高","全部收费,屌丝请绕过"]列表的 "全部收费,屌丝请绕过" 删除。
# 3,将此 ["质量很高,真的很高","全部收费,屌丝请绕过"]列表的 "全部收费,屌丝请绕过" 删除。
# 4,将此["质量怎样不清楚,个人已经不喜欢日韩范了","verygood"]列表的 "verygood"全部变成大写。
# 5,给 '大陆' 对应的字典添加一个键值对 '1048' :['一天就封了']
# 6,删除此"letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"]键值对。
# 7,给此["全部免费,真好,好人一生平安","服务器在国外,慢"]列表的第一个元素,加上一句话:'可以爬下来'
# 3 av_catalog = { "欧美":{ "www.youporn.com": ["很多免费的,世界最大的","质量一般"], "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"], "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"], "x-art.com":["质量很高,真的很高","全部收费,屌丝请绕过"] }, "日韩":{ "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","verygood"] }, "大陆":{ "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"] } } # 1 av_catalog['欧美']['www.youporn.com'].insert(1,'量很大') print(av_catalog) # 2 av_catalog['欧美']['x-art.com'].remove('全部收费,屌丝请绕过') print(av_catalog) # 3 # av_catalog['欧美']['x-art.com'].pop(1) # print(av_catalog) # 4 av_catalog['日韩']['tokyo-hot'][1] = av_catalog['日韩']['tokyo-hot'][1].upper() print(av_catalog) # 5 av_catalog['大陆'].setdefault('1048','[一天就封了]') print(av_catalog) # 6 del av_catalog['欧美']["letmedothistoyou.com"] print(av_catalog) # 7 av_catalog["大陆"]["1024"].insert(0,'可以爬下来') print(av_catalog)
4、有字符串"k:1|k1:2|k2:3|k3:4" 处理成字典 {'k':1,'k1':2....}
dick1 = {} msg = "k:1|k1:2|k2:3|k3:4".replace('|',':').split(":") for k in range(0,len(msg),2): dick1[msg[k]] = int(msg[k+1]) print(dick1)
# 4 dic = {} k = 'k:1|k1:2|k2:3|k3:4' dic.setdefault(k[0],k[2]) dic.setdefault(k[4:6],k[7]) dic.setdefault(k[9:11],k[12]) dic.setdefault(k[14:16],k[17]) print(dic)
5、元素分类
有如下值li= [11,22,33,44,55,66,77,88,99,90],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
即: {'k1': 大于66的所有值列表, 'k2': 小于66的所有值列表}
# 5 dic = {} li= [11,22,33,44,55,66,77,88,99,90] k1_list = [] k2_list = [] for i in li: if i > 66: k1_list.append(i) elif i < 66: k2_list.append(i) dic.setdefault('k1',k1_list) dic.setdefault('k2',k2_list) print(dic)
6、输出商品列表,用户输入序号,显示用户选中的商品
商品 li = ["手机", "电脑", '鼠标垫', '游艇']
要求:1:页面显示 序号 + 商品名称,如:
1 手机
2 电脑
…
2: 用户输入选择的商品序号,然后打印商品名称
3:如果用户输入的商品序号有误,则提示输入有误,并重新输入。
4:用户输入Q或者q,退出程序。
# 6 shop ={} li = ["手机", "电脑", '鼠标垫', '游艇'] for i,v in enumerate(li,1): shop.setdefault(i,v) flag = True while flag: shop_input = input("input:").strip() if shop_input.upper() == 'Q': flag = False elif shop_input.isdigit(): if int(shop_input) <= len(li): print(shop[int(shop_input)]) flag = False else:print("输出序号超出范围") else:print("输出的参数不合法")
三、复习题
1)字典的增删改查。
字典的增:1,有则覆盖,无则添加dic[添加的键] = 添加的值
2,setdefault,无则增加,有则不变,dic.setdefault(添加的键,添加的值)
删:1,pop有返回值删除
2,clear清空
3,del删除键值对,也可以删除字典
改:1,直接修改,dic[添加的键] = 添加的值
2,两个字典,要更新的字典.update(不变的字典)
查:1,直接按键值查找dic[键值]
2,用get直接查找dic.get(键值)
2)过滤敏感字符代码的默写。
li = ["苍老师","东京热","武藤兰","波多野结衣"] l1 = [] comment = input("input") for i in li: comment = comment.replace(i,'*'*len(i)) l1.append(comment) print(l1)