字典
字典是没有顺序的可变序列,他通常都是成对储存,每个元素都有键值对,通过键对象可以找到值对象,键对象是任意不可变对象且不能重复,例如元组,字符串,而值对象可以是任意对象而且可以重复。例:a={'name':'txy','age':'23'}中,name和age就是键对象而txy和123则是值对象
字典的创建
- 可以通过dict(),{ }来创建字典对象,例:a={'name':'txy','age':'23'}/a=dict(name:'txy',age:23)/a=dict([("name","txy")("age",23)])
- 通过zip创建字典对象 k=['name','age','job'] v=['txy','23','student'],d=dict(zip(k,v))
- 通过fromkeys创建值为空的字典 a=dict.fromkeys(['name','age','job'])
字典元素的访问
- 通过键来或者值,若键不存在则提示出错
- 通过get()方法来获得值,推荐使用,若键不存在返回None或者返回默认返回的对象 a.get("不存在的对象","不存在")
- 通过items()来列出所有的键值对
- 通过keys()来列出所有的键,通过values()来列出所有的值
- len()列出键值对的个数
- 用In操作符检测一个键是否在字典中
字典元素的添加修改和删除
- 直接添加a['address']='Shanghai', 如果键存在,则覆盖旧的键值对,如果键不存在则添加新的键值对。
- 通过update()将新字典中的所有键值对添加到旧字典对象上,如果键存在,则覆盖。a.update(b)#用b完全替换a
- 字典中元素的删除可以通过del(),clear()删除所有的键值对,pop()可以删除指定键值对,但是会返回删除的键所对应的值
- popitem():随机删除和返回该键值对
序列解包
既可以用于列表也可以用于字典,用途是对多个变量进行赋值。在对字典进行序列解包时,默认是对键进行操作,对键值对操作需要用代码items(),对值进行操作需要用代码values().
用字典和列表对表格进行存储
r1={"品牌":"大众","车型":"SUV","价位":400000,"颜色":"黑色"}
r2={"品牌":"奔驰","车型":"轿车","价位":500000,"颜色":"银色"}
r3={"品牌":"保时捷","车型":"跑车","价位":1200000,"颜色":"红色"}
tb=[r1,r2,r3]
#获得第二行车的颜色
print(tb[1].get("颜色"))
#打印所有价位
for i in range(len(tb)): #i-->0,1,2
print(tb[i].get("价位"))
#打印所有的数据
for i in range (len(tb)):
print(tb[i].get("品牌"),tb[i].get("车型"),tb[i].get("价位"),tb[i].get("颜色"))
字典核心底层原理
字典中存在许多空白的元素数组,数组的单元叫做bucket,bucket有两个部分,一个是键对象的引用,一个是值对象的引用,可以使用偏移量来访问bucket。
将键值对放入字典的核心过程就是将键放入字典中的索引数字。
先将键变成一个hash值通过hash("name"),在用过bin可以查看其二进制数。如果目标字典的数组值为8,则可以使用最右边三位来找到其对应的索引数字,若是空的则降值放进去,若不是空的则再向左平移三位来确定索引值,直到值被放入,若三分之二的位置满了,则数组会进行扩容。
根据键来查找“键值对”的底层过程
第一步还是和放入的流程一样先将需要的值的键进行hash再通过bin()得到其索引值,若数组对应的索引值为空,则返回None,若不为空则去除这个数组的键,计算其数列值,若相同则说明找到了,若不相同则项佐平移三个继续计算比较。
总结:
- 键必须可散列
- 字典在内存中消耗巨大
- 键查询速度很快
- 不要再遍历字典的同时对字典进行修改
集合
集合是元素可变,元素不能重复,集合的底层结构和字典相同,只包含字典的键对象
集合的创建和删除
- 用{ }创建集合对象,并使用add()方法来添加元素
- 用set()将列表,元组转变为集合
- 用remove()来删除指定元素,clear()来清空整个集合
集合相关操作
集合可以通过使用交集(a&b),并集(a|b),差集(a-b)来获得新的集合
控制语句:
选择结构:选择结构分为单分支结构,双分支结构,多分支结构
单分支结构:通常是if语句,条件表达式可以是逻辑,算术和关系。语句块注意要缩进
条件表达式的值为False的情况有一下几种:False,0,空序列,空迭代,空range对象 除以上情况其他都是True
其外条件表达式中不能有赋值操作
双分支结构:采用if,else语句。
三元条件运算符:条件为真时的值 if(条件表达式) else 条件为假时的值 Print "s小于10"if int (s) <10 else “s大于10”
多分支选择结构:由多个条件表达式组成, 表达式之间必须要有逻辑关系。elif=else if
测试平面象限中点的位置代码:
#测试点在坐标轴的位置
x= int(input("请输出横轴坐标:"))
y= int(input("请输出纵轴坐标:"))
if(x==0 and y==0):
print("这个点是在原点上")
elif (x==0):
print("这个点在x轴上")
elif(y==0):
print("这个点在y轴上")
elif(x>0 and y>0):
print("这个点在第一象限")
elif(x>0 and y<0):
print("这个点在第四象限")
elif(x<0 and y<0):
print("这个点在第三象限")
else:
print("这个点在第二象限")
选择结构的嵌套:在一个选择结构中再加入一个选择结构,需要注意缩进量来区别不同的选择结构
#选择结构嵌套
score=int(input("请输入一个0-100的数字:"))
num=0
degree="ABCDE"
if score>100 or score<0:
score = int(input("请输入一个0-100的数字:"))
else:
num=score//10
if num<6:
num=5
print("分数是{0},成绩是{1}".format(score,degree[9-num]))
while循环结构:循环体中一定需要改变条件表达式的语句
#计算1-100之间的数字的累加和
num=0
sum=0
while num<=100:
sum=sum+num
num+=1
print("1-100之间的累加和为:",sum)