数据类型的分类(可变与不可变):
- 可变(不可哈希)的数据类型:list dict set
- 不可变(可哈希)的数据类型: str bool int tuple
字典:{}括起来,以健值对形式存储的容器型数据类型:
dic = {"key":1,1:123,False:True,(1,2,3):"abc",1:[1,3,4]}
print(dic)
- 键必须是不可变的数据类型,int str(bool tuple几乎不用)唯一的
- 值可以是任意数据类型,对象
- 字典是无序的,python3,6按照初次建立字典的顺序排列,学术上不认为是有序的,
- 字典3,7x以后都是有序的
- 字典是可变的,增加,删除,修改,查看 其他操作
- 字典的优点:查询速度非常快,存储关联性的数据
- 字典的缺点:以空间换时间
1.字典的三种创建方式
面试会考:
方式一:
dic = dict((('one', 1), ('two', 2), ('three', 3)))
print(dic) # {'one': 1, 'two': 2, 'three': 3}
方式二:
dic = dict(one=1, two=2, three=3)
print(dic)
方式三:
dic = dict({'one': 1, 'two': 2, 'three': 3})
print(dic)
- 验证字典的合法性
dic = {[1,2,3]: 'alex', 1: 666} # 键要不可变的数据类型
print(dic)
dic = {1: 'alex', 1: '小刚', 2: 'wusir'} # 键要唯一
print(dic)
2.字典的增删改查
增:
dic = {"a":"b","b":"c"}
直接增加 有则改之 无则增加
dic[键]=值
dic['c']=c 增加
dic['a']=1 改
setdefault 有则不变 无则增加
dic.setdefault("c","aaa")
print(dic)
删:
pop 按照键删除键值对,有返回值,返回的是删除的值***
设置第二个参数则无论字典中有无此键都不会报错
dic.pop('b')
ret=dic.pop('b')
ret=dic.pop('hobby','没有此键')
print(ret)
print(dic)
del dic # 删除整个字典
del dic['b'] #删除指定的键值对
clear 清空
dic.clear() 清空
print(dic)删除整个字典中的键值对
改:
dic1 = {"a":"b","C":"c"}
dic1['b']='值' 键在字典中存在就是修改,键在字典中不存在就是增加
dic2 = {1:2,"a":"a1"}
dic2.update(dic1) # update括号里的字典级别高,括号中添加的是字典
print(dic2)
查:
字典的查询只能通过键获取值,不能通过值获取键
dic = {1:2,"a":"a1"}
print(dic["c"]) # 如果有键在字典中存在就放回键对应的值,如果不存在就报错
print(dic.setdefault(1))>>>返回的是字典的值
print(dic.setdefault(2))>>>键不存在,返回的是None
get -- 获取***
dic.get('c')#键不存在返回的是None
dic.get('d','没有此键') 可以设置返回值,获取值的时候可以指定返回的内容,键不存在的时候不报错
dic={'a':1}
dic['a'] +=1
dic.get('a')
print(dic)
dic = {1:2,"a":"a1"}
for i in dic:#for循环字典的时候打印的是字典的键
print(j,dic[i])
例1:
dic = {"1":1,"2":2,"3":3,"4":4}
# 删除"2" 2种方式
dic.pop("2")
del dic["2"]
# 添加 "5":5 2种方式
dic.setdefault("5",5)
dic["5"] = 5
# 修改: "1":10086
dic["1"] = 10086
# 查看"3"的值
dic.get("3",'没有值')
dic["3"] # 没有就会报错
dic = {"1":1,"2":2,"3":3,"4":4}
3.keys() values() items()
print(dic.keys(),type(dic.keys()))
可以转化成列表
print(list(dic.keys()))
li = []
for key in dic:
li.append(key)
print(li)
for i in dic.keys():#高仿列表
print(i)
print(type(dic.keys())) 可以for循环,但是不能索引
dic_li = dic.keys()
print(dic_li)
dic = {"1":1,"2":2,"3":3,"4":4}
print(dic.keys())>>>返回值#dict_keys(['1', '2', '3', '4'])
print(dic.values())>>>返回值#dict_values([1, 2, 3, 4])
print(dic.items())>>>返回值
#dict_items([('1', 1), ('2', 2), ('3', 3), ('4', 4)])
for i in dic.items():
print(i)
#循环打印每一个元祖
('1', 1)
('2', 2)
('3', 3)
('4', 4)
4.解构
a = 1
b = 2
print("is a",id(a))
print("is b",id(b))
a,b = b,a #改变的是内存地址的指向
print("is a",id(a))
print("is b",id(b))
a,_,c = "你好啊"
print(a,c) >>>你 啊
a,b分别赋值
a,b=('1','2')
print(a,b)
a,b=['4','5']
print(a,b)
a,b={"a":1,"b":2,}#得到的是字典的键
print(a,b)
dic = {"1":1,"2":2,"3":3,"4":4}
for key,value in dic.items():
print(key,value)
keys,values,items,解构
dic={"1":1,"2":2,"3":3,"4":4}
for i in dic: #效率高
print(i,dic[i])
for k,v in dic.items():
print(k,v)
5.字典的循环取值
dic = {"电脑":15000,"手机":8000,"耳机":4000,"手表":1111}
1 电脑
2 手机
3 耳机
4 手表
for i in range(len(dic)):
print(i+1)
count = 1
for i in dic:
print(count,i)
count += 1
li = [1,2,3,4,54]
for i,k in enumerate(li): # enumerate 第二个参数默认不写就是0 -- 枚举
print(i,k)