构建字典
无序 不可索引
1、使用大括号
dic = { } #空字典
dic = {'name':'Rachel','age':25}
2、使用dict方法
[ ] dict(key=value)
dic = dict(a=1,b=2,c=3)
dic = dict('a'=1,'b'=2) #-->语法错误,报错
[ ] dict(iterable)
#iterable的每个元素必须是两元素的数据对象,就是元组放在列表中
offer = dict([('company','huawei'),('salary',1500),('reward',10000)])
print(offer)
#output-->{'company': 'huawei', 'salary': 1500, 'reward': 10000}
3、dict类的方法fromkeys,构造的字典key来自于给定的序列(元组,列表,字符串),
第二个参数是所有value的初始值,不给定则默认为None
调用fromkeys()函数时:
-
直接用dict类名调用
-
用任一个字典变量调用
[ ]fromkeys(seq,value)
i.seq为列表
lst = ['a','b','c','d','e']
dic= dict.fromkeys(lst,5)
print(dic)
#-> {'a': 5, 'b': 5, 'c': 5, 'd': 5, 'e': 5}
ii.seq为元组
t = ('a','b','c','d','e')
dic= dict.fromkeys(t,5)
print(dic)
#-> {'a': 5, 'b': 5, 'c': 5, 'd': 5, 'e': 5}
iii.seq为字符串
s = 'abcde'
dic = dict.fromkeys(s)
print(dic)
#->{'a': None, 'b': None, 'c': None, 'd': None, 'e': None}
iv.seq为集合
hyc_set = {'a','b','c','d','e'}
dic= dict.fromkeys(hyc_set,5) #用dict类名直接调用
print(dic)
#->{'a': 5, 'c': 5, 'd': 5, 'b': 5, 'e': 5}
v.seq为字典,取原字典中的key,生成一个新的字典
dic = {'name':'Rachel','age':25}
dic_new= dic.fromkeys(dic,'aa') #可以用任一个字典变量调用,且不改变调用对象的值
print(dic_new)
#->{'name': 'aa', 'age': 'aa'}
4.copy()
根据已有字典拷贝一个新的字典
dic = {'name':'Rachel','age':25}
dic_new= dic.copy()
print(dic_new)
print(id(dic),id(dic_new))# 同样是浅拷贝
#-->{'name': 'Rachel', 'age': 25}
#-->2819141912760 2819140572936
检索元素
1、通过key检索元素value
dic[key] #如果key存在,则返回对应value;否则,报错
dic = {'name':'Rachel','age':25}
print(dic['name'])
#-->Rachel
2、判断key是否存在,存在返回True,不存在返回False
in 或 not in
dic = {'name':'Rachel','age':25}
print('sex' in dic)
#->False
3、get(key[,default])
检索元素中的key,如果key存在,返回对应的value;
如果不存在,且指定default,返回指定的default默认值;
如果不存在,且没指定default,则返回None
dic = {'name':'Rachel','age':25}
print(dic.get('sex'))-->None
print(dic.get('height','180cm'))-->180cm
4、len()检索字典元素个数
添加元素
dic[key]=值 对不存在的键直接赋值,即添加key-value对
dic = {'name':'Rachel','age':25}
dic['sex'] = 'girl'
print(dic)
#->{'name': 'Rachel', 'age': 25, 'sex': 'girl'}
修改元素
1、对已存在的key重新赋值,即更新value,修改只能修改value,key不能改
dic = {'name':'Rachel','age':25}
dic['age']=18
print(dic)
#->{'name': 'Rachel', 'age': 18}
2、update(key/value)根据给定的key/value对更新键的值,如果键不存在则新插入
参数形式:字典,key=value,2个元素的迭代容器对象
d={'one':1,'two':2,'three':3,'four':4}
d.update(five=5,six=6)
print(d)
#->{'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6}
d.update({'one':11,'two':22})#以字典作为参数
print(d)
#->{'one': 11, 'two': 22, 'three': 3, 'four': 4, 'five': 5, 'six': 6}
d.update((('five',55),('six',66)))#元组形式
d.update((['three',33],['four',44]))#列表形式
删除元素
1、del dic[key]
删除某个key-value,如果key不存在会报错
2、clear() 删除字典中所有元素
d={'one':1,'two':2,'three':3,'four':4}
d.clear()
print(d)
#--> {}
3、pop(key[,default])用来移除给定的元素并返回移除的key对应的value,
如果元素不存在,则返回default
如果元素不存在,也没有给定default,则报错
d={'one':1,'two':2,'three':3,'four':4}
d.pop('two')
#-->2
4、popitem()用于移除并返回一个(key,value),并返回移除的元素
每次移除一个
按后进先出顺序移除(python 3.7之后)
d={'one':1,'two':2,'three':3,'four':4}
d.popitem()
#-->('four', 4)
遍历
d={‘one’:1,‘two’:2,‘three’:3,‘four’:4}
1、keys()遍历所有key
for i in d.keys(): #因为字典的key可遍历,也可以直接写 for i in d:
print(i)
2、values()遍历所有值
for i in d.values():
print(i)
3、items()遍历所有key和value
for key,value in d.items():
print(key,"-->",value)
4、iter(d)返回字典中所有key组成的可迭代对象,等价于iter(d.keys())
print(iter(d))
for i in iter(d):
print(i)
#<dict_keyiterator object at 0x0000029061F63098>
#one
#two
#three
#four
补充:keys()、values()、items()返回字典视图对象,会随着原字典的改变而改变
将视图对象构建一个列表
如:list(d.keys())
5、字典解析
d = {x: x*2 for x in range(4) }
print(d)
d2={k:2*v for k,v in d.items()}
print(d2)
#{0: 0, 1: 2, 2: 4, 3: 6}
#{0: 0, 1: 4, 2: 8, 3: 12}
字典元素存储
存:
对于存储dict元素的时候,先计算key的hash值,然后将hash值存储到dic对象中,与每个hash同属存储的还有两个引用,key的引用地址,value的引用地址
一个hash值8字节,每个引用地址8字节,所以对于一个dict的元素,除了数据实际数据占用的内存空间,至少需要占用24个字节(每个引用地址是8个字节)
取:
如果要从dict中取出key对应的那个记录,则首先计算这个key的hash值,然后从dict对象中查找这个hash值,能找到说明有对应的记录,然后找到对应的key、value数据
补充:不可变对象才可以hash,所以字典的key必须是不可变类型