字典
前面讲到的字符串,列表,元组都是有序的集合
概念:字典是无序的,可变的,键值对集合(key-value组合)
无序的集合无法根据索引来访问
定义方式
- 方式1 {key:value,key:value}
注意:对于无序的集合,不能用索引来进行访问了
person = {'name':'lw','age':12}
print(person,type(person))
print(person['name'])
print(person['age'])
- 方式二:fromkeys(S,v=None)
- 借用了一个静态方法,类和对象都可以调用
- 类调用 dict.fromkeys(seq,value) seq是个序列,这个序列就是我们之前讲的有序的集合;value就是key-value中 的value。 就是根据有序序列,把有序序列转换为一个key,后面的value自己设定
d = dict.fromkeys([1,2,3],666)
print(d)
注意:key不能重复,如果重复了,后面的值会把前面的值覆盖掉;并且key必须是任意不可变类型
d = {'a':1,'b':2,'a':3}
print(d)
这个不可变类型怎么看呢?比如说列表当作key的时候就会报错,因为list会改变,因为当list增加或者减少的时候,它的id是不变的,而一个变量就是不可变的类型。
id不发生改变的那么这个是可变类型,id发生改变的是不可变类型
为什么这样呢?是因为字典是采用hash的方式实现的
- 字典的存储过程:初始化一个表格,用来存放所有的值,这个表格称为哈希表
在存储一个键值对的时候,会作如下操作,根据给定的key,通过某些操作,得到一个在哈希表中的索引位置;根据索引位置,存储给定的值。
取得过程正好是相反的, - 字典的存在意义:可以通过key查询使得查询更有意义;查询的效率也大大提高
字典的常用操作
- 字典的常用操作-----增
- dict【key】=value,当key不存在的时候,即为新增操作
d = {'name':'sz','age':'18'}
print(d,type(d))
d['height'] = 180
print(d)
- 字典的常用操作-----删
- 方式一:del dict【key】,对应的value也会删除哦,因为是捆绑的,并且key必须是存在的
- 方式二:dict.pop(key【,default】):弹出指定的键值对,并且把这个键值对删除。
【】里面是可选的,也就是说【】可有可无,如果key不存在,则返回default值 - 方式三:dict.popitem:删除最后一个键值对,并且以元组的形式返回该键值对;如果字典为空,则会报错
- 方式四:dict.clear() 删除字典内所有的键值对,返回值是None,字典本身还存在,但是里面的元素不存在了
d = {'name':'sz','age':'18'}
del d['name']
print(d)
d1 = {'name':'sz','age':'18'}
print(d1.pop('age'))
print(d1.pop('sss',6))
print(d1)
d2 = {'name':'sz','age':'18'}
print(d2.popitem(),d2)
d3 = {'name':'sz','age':'18'}
print(d3.clear(),d3)
- 字典的常用操作-----改
- 只能改值,不能改key;修改单个键值对:dict【key】= value;如果key不存在,则新增
- 批量修改键值对,oldDict.update(newDict);根据新的字典,批量更新旧字典中的键值对,如果旧字典没有对应的key,则新增键值对。
d = {'name':'sz','age':18}
print(d)
d['age']= 24
print(d)
d1 = {'name':'sz','age':18}
print(d1)
d1.update({'age':24,'height':180})
print(d1)
- 字典的常用操作-----查
- 获取单个值:方式1 dict【key】,如果key不存在,则会报错;方式二 dict.get(key,【default】),中括号是可选的,也可以选择不写,返回值是想要查询的key对应的value,如果查询到了,则会返回该value,如果没有查询到则会返回default。方式三 dict.setdefault(key【default】)获取指定key对应的value,如果key不存则会在字典中增加这个key,并且自己设定默认值为None,并且返回None;如果没有设定默认值,则返回None。
#方式1
d = {'name':'sz','age':18}
print(d['age'])
#方式二
d1 = {'name':'sz','age':18}
result = d1.get('name')
result1 = d1.get('height',6)
print(result)
print(result1)
#方式三
d2 = {'name':'sz','age':18}
print(d2)
print(d2.setdefault('name'))
print(d2.setdefault('height',6))
print(d2)
- 获取所有的值 dict.values()
- 获取所有的键 dict.keys()
- 获取字典的键值对 dict.items()
d = {'name':'sz','age':18}
print(d)
print(d.values())
print(d.keys())
print(d.items())
print('改变后-----------')
d['height'] = 180
print(d)
print(d.values())
print(d.keys())
print(d.items())
这里的view objects是什么呢,就是说是一个视图,如果这个字典发生变化的时候这个视图也会跟着发生变化。
- 遍历操作 方式一:根据所有的key进行遍历;方式二 直接遍历所有的键值对
#方式一
d = {'name':'sz','age':18,'height':180}
keys = d.keys()
for key in keys:
print(key)
print(d[key])
#方式二
d = {'name':'sz','age':18,'height':180}
kvp = d.items()
print(d.items()) #我们可以看到给出的view object是个元组类型
for p in kvp: #元组的解包操作
print(p)
for k,v in kvp:
print(k,v)
- 字典的计算和判定操作
- 计算操作:计算键值对的个数 len(dict)
- 判定操作 x in dict判定x是在字典中的key中 也可以改成not in
d = {'name':'sz','age':18,'height':180}
print(len(d))
print('name' in d)
print(18 in d)