字典
字典是“键值对”的无序可变序列。字典中的每个元素都是一个键值对,包含:“键对象”和“值对象”,可以通过“键对象”实现快速获取、删除、更新对应的“值对象”。
列表中我们通过“下标数字”找到对应的对象。字典中通过“键对象”找到对应的“值对象”。“键”是任意不可变数据,比如:整数、浮点数、字符串、元组。但是:列表、字典、集合这些事可变对象,不可能作为“键”。并且“键”不可重复。“值”可以是任意的数据,并且可以重复。
字典的创建
1.可以通过{}、dict{}来创建字典对象。
>>>a = {'name':'gaoqi','age':'18','job':'programmer'}
>>>b = dict(name='gaoqi',age=18,job='programmer')
>>>a = dict([("name","gaoqi"),("age","18")])
>>>c = {} #空
>>>d = dict{}
2.通过zip()创建字典对象
>>>k= ['name','age','job']
>>>v = ['gaoqi','18','programmer']
>>>d = dict(zip(k,v))
>>>d
('name':'gaoqi','age':'18','job':'programmer')
zip的第一个参数是键。
3.通过fromkeys创建值为空的字典
>>>a = dict.fromkeys(['name','age','job'])
>>>a
{'name':None,'age':None,'job':None}
None表示的是值。
字典元素的访问
>>>a = {'name':'gaoqi','age':'18','job':'programmer'}
1.通过[键]获得[值]。若键不存在,则抛出异常
>>>a['name']
'gaoqi'
>>>a['age']
18
>>>a['sex']
异常
2.通过get()方法获得“值”。推荐使用。优点是:指定键不存在返回None;也可以设定指定键不存在时默认返回的对象,推荐使用get()获取“值对象”。
>>>a.get('name')
'gaoqi'
>>>a.get('sex')
>>>a.get('sex','一个男人')
'一个男人'
3.列出所有的键值对
>>>a.items()
dict_items([('name','gaoqi'),('age','18'),('job','programmer')])
4.列出所有的键,列出所有的值
>>>a.keys()
dict_keys(['name','age','job'])
>>>a.values()
dict_values(['gaoqi','18','programmer'])
5.len()键值对的个数
>>>len(a)
6.检测一个“键”是否在字典中
>>>"name" in a
True
字典元素添加、修改、删除
1.给字典新增“键值对”。如果“键”已经存在,则覆盖旧的键值对;如果“键”不存在,则新增“键值对”。
>>>a['address] = 'shenyang'
2.使用update()将新字典中所有键值对全部添加到旧字典对象上。如果key有重复,则直接覆盖。
>>>a.update(b)
3.字典中元素的删除,可以使用del()方法;或者clear()删除所有的键值对;pop()删除指定键值对,并返回对应的“值对象”;
>>>del(a['name'])
>>>b = a.pop('age')
>>>b
'gaoqi'
>>>a.clear()
4.popitem():随机删除和返回该键值对。字典是“无序可变序列”,因此没有第一元素、最后元素的概念;popitem弹出随机的项,因为字典并没有“最后的元素”或者其他有关顺序的概念。若想一个接一个地移除并处理项,这个方法就非常有效(因为不用首先获取键的列表)。
序列解包
序列解包可以用于元祖、列表、字典。序列解包可以让我们方便的对多个变量赋值。
序列解包用于字典时,默认是对“键”进行操作;如果需要对键值对操作,则需要使用items();如果需要对“值”进行操作,则需要使用values();
默认是对键进行操作,对键值对操作,则需要使用items()
表格数据使用字典和列表存储
字典核心底层原理
存储的底层过程
字典对象的核心是散列表,散列表是稀疏数组(总有空白元素的数组),数组的每个单元叫做bucket,每个bucket由两部分:一个是键对象的引用,一个是值对象的引用,由于所有bucket结构和大小一致,可以通过偏移量来读取bucket。
每个字典在创建时有一个默认大小,在存储过程中,对要存储的键先进行编码,根据一定的规则去依次填充字典,如哈希值的编码,如果所在位置为空,则直接填充,如果所在位置不空,则依次选择右旁边的位置进行填充,直到找到空的bucket。
python会根据散列表的拥挤程度扩容,创造更大的数组,将原有内容拷贝到新数组,接近三分之二时,数组就会扩容。
根据键查找键值对的底层过程
同样的,也是先计算要找的键的散列值,然后去相应位置去查找,如果不空,则进行一次比较,看所在位置的键对象的散列值是否相同,如果相同则返回键值对,不同则去旁边继续寻找,直到遍历所有,然后返回空。
字典在内存中开销巨大,典型的空间换时间。键查询速度很快,往字典中添加新键可能会导致扩容,导致散列中键的次序变化,因此不要在遍历字典的时候进行字典的修改。
集合
集合时无序可变的,元素不能重复,集合底层是字典实现,集合的所有元素是字典的键对象,因此是不能重复且唯一的。
集合创建和删除
1、使用{ }创建集合对象,并使用add( )添加元素
2、使用set( )转化为集合
3、remove( )删除指定元素,clear( )清空整个集合
集合相关操作
a|b 并集a.union(b)
a&b 交集a.intersection(b)
a-b差集a.difference(b)
选择结构
选择结构通过判断条件是否成立,来决定执行哪个分支,分为单分支,双分支,多分支。
在循环结构中,条件表达式的值为False的情况如下:False,0,空值None,空序列对象(空字符串,空列表,空字典等),空range,空迭代对象。除此之外,均为True。
条件表达式中不能有赋值操作符‘=’
三元条件运算符
条件为真时的值,if(条件表达式)else 条件为假时的值
选择结构嵌套,选择结构可以嵌套使用时一定要注意空值好不同级别代码块的缩进量。