字典dict也叫映射mapping,字典由任意个元素组成,每个元素叫item或entry。每个item是由(key-value)键值对组成的二元组
可变性:可根据key对元素进行定位并修改元素的value值
无序性:字典是无序的,在Python3.6.x之后,字典会根据录入顺序来显示,但这并不代表字典是有序的
key唯一性:字典存储时会对key进行hash计算,相同的key只会计算成同一个值,因此字典中是不可能允许相同key同时存在的
字典初始化
dict() ##要使用关键字dict来初始化
dict(**kwarg) #直接使用key=value的方式赋值,**kwargs表示的是若干个key=value
dict(iterable,**kwarg) #使用可迭代对象和key=value来生成,可迭代对象中的元素必须是一个二元结构
dict(mapping,**kwarg) #使用映射(另一个字典)和key=value来生成
>>> d1={} #这是字典专用的初始化格式,集合虽然也是以大括号包围,但是不能这样初始化
>>> d2=dict(name='xiejiawen',age=25,sex='male')
>>> d3=dict([('a',2),('b',3)],fundation='hangzhou',country='China')
>>> d4=dict(d2,profession='cs')
>>> print(d1)
>>> print(d2)
>>> print(d3)
>>> print(d4)
{}
{'name': 'xiejiawen', 'age': 25, 'sex': 'male'}
{'a': 2, 'b': 3, 'fundation': 'hangzhou', 'country': 'China'}
{'name': 'xiejiawen', 'age': 25, 'sex': 'male', 'profession': 'cs'}
也可以完全使用key:value的方式来初始化,不过key必须是可hash的
>>> d6={'name':'xiejiawen','name2':'111'} #此处没有使用dict关键字,并且括号是{}
>>> print(type(d6),d6) #key如果是字符串,需要使用引号包围,
fromkeys方法
#dict.fromkeys(iterable,value)
>>> a=dict.fromkeys(range(10),0) #key为range(10)中的序列,0是给定的默认值
>>> print(a)
{0: 0, 1: 0, 2: 0, 3: 0, 4: 0} #如果不给定默认值,那么value就是None
查询
d[key] #返回key对应的value,不存在则报KeyError
get(key[,default]) #返回key对应的value,不存在返回default,没设置默认值则返回None
setdefault(key[,default]) #返回key对应的value(注意不是修改),如果key不存在则添加键值对,value设置为default,没有default就设置为None
>>> d3={'a': 2, 'b': 3, 'fundation': 'hangzhou', 'country': 'China'}
>>> d3['country']
'China' #这个China是返回的,不是输出的
>>> d3.get('a',999)
2 #返回值
>>> d3.setdefault('b',987)
3 #返回值
>>> d3.setdefault('c',996)
996 #返回值
>>> print(d3)
{'a': 2, 'b': 3, 'fundation': 'hangzhou', 'country': 'China', 'c': 996} #新加了一个键值对
更新update
dict1.update(dict2) 将dict2中的数据加到dict1中
dict1 = {'name': 'tom', 'age': '18'}
dict2 = {'sex': 'male'}
# 如果dict2中有些item和dict1中完全一样,那就保留一个item,其他的内容增量添加
dict1.update(dict2)
print(dict1)
{'name': 'tom', 'age': '18', 'sex': 'male'} #注意不是追加,因为字典是没有顺序的
修改
d[key]=value #将key对应的值修改为value,key不存在则添加新的kv对
update([other]) --> None #使用kv对来更新本字典,本字典存在此key的就覆盖本地,key不存在的就添加kv对
>>> d3={'a': 2, 'b': 3, 'fundation': 'hangzhou', 'country': 'China'}
>>> d3['a']=97
>>> d3.update(b=98,c=99)
>>> print(d3)
{'a': 97, 'b': 98, 'fundation': 'hangzhou', 'country': 'China', 'c': 99}
>>> d3.update({'a':2})
>>> print(d3)
{'a': 2, 'b': 98, 'fundation': 'hangzhou', 'country': 'China', 'c': 99}
删除
pop(key[,default]) #移除key对应的键值对,key不存在返回default值;没默认值并且key也不存在就会报KeyError
popitem() #移除任意一个item并返回,如果字典为空报KeyError
clear() #清空字典
>>> d6={'name': 'xiejiawen', 'name2': '111'}
>>> d6.pop('name','zhangsan')
'xiejiawen'
>>> d6.popitem()
('name2', '111')
遍历
遍历key
#这两个是等价的
for i in d:
print(i)
for k in d.keys(): ##key返回的是一个类集合,因为key都是可以hash的
print(k)
遍历value
#这些方式都可以遍历value
for i in d.values():
print(i)
for j in d.keys():
print(d[j])
#print(d.get(j))
遍历item
for i in d.items():
print(i)
print(i[0],i[1])
for k,v in d.items():
print(k,v)
for k,_ in d.items():
print(k)
for _,v in d.items():
print(v)
遍历与删除
使用key,values,items方法遍历字典的时候,不可以改变字典的长度
d=dict(a=1,b=2,c=3)
for k,v in d.items():
print(d.pop(k)) ##这样就是错误的操作
可以这样操作
for i in len(d): #只要长度不为0就可以继续遍历
print(d.popitem())
for j in d:
print(d.popitem())
也可以使用列表来装载key,然后在根据列表中的kye来删除
# for 循环正确删除
d = dict(a=1, b=2, c=3)
keys = []
for k,v in d.items():
keys.append(k)
for k in keys:
d.pop(k)