字典的创建:
1、dic={'姓名':'高崎','年龄':19}
2、dic=dict()
dic=dict('姓名'='高崎','年龄'=19)
dic=dict([('姓名','高崎'),('年龄',19)])
3、通过zip创建字典对象
k=['姓名','年龄']
v=['高崎',19]
dict(zip(k,v))
4、通过fromkeys创建值为空的字典
dic=dict.fromkeys(['姓名','年龄'])
print(dic)
字典元素的访问:
dic['姓名']:字典通过键对值进行访问
dic.get('姓名'):通过get方法获得值,好处是指定键不存在则返回None,也可以设定键不存在时返回默认对象
dic.get('城市','不存在'):当访问的键不存在时返回逗号后的“不存在”
dic.items():访问字典中的键值对
dic.keys():访问字典中的键
dic.values():访问字典中的值
检测一个键是否在字典中
'name' in dic:返回布尔值True or False
字典元素的添加、修改、删除
a['城市']='深圳'#如果字典a中有键城市则对键城市的值进行修改,改为深圳,如果a中没有城市则添加城市为新的键
a.update(b):a和b均为字典,该方法表示对字典a进行更新,b和a重复的键则采用b的值,b和a不重复的键则将b的键新增到a中
del(a['姓名'])#删除字典a中键姓名对应的键值对全部删除
b=a.pop('姓名')#删除字典中键姓名对应的键值对,并返回姓名对应的值
b=a.popitem()#随机删除字典a中的某1个键值对并返回该键值对,括号中不可填入任何参数
序列解包
x,y,z=(20,30,50),x,y,z=[20,30,50]
对x,y,z进行赋值,可不加括号
序列解包用于字典时默认对键进行操作,对键值对操作用items(),对值操作用values()
s = {'name':'gaoqi','age':18,'job':'teacher'}
name,age,job=s#将name、age、job分别与字典a的键顺序进行一一对应,将键的值赋值给变量name,age,job。
name,age,job=s.items() #将字典s的键值对顺序赋值给三个变量
name,age,job=s.values() #将字典s的值顺序赋值给三个变量
表格数据使用字典和列表进行存储,并实现访问
r1={'name':'高小一','age':18,'salary':30000,'city':'北京'}
r2={'name':'高小二','age':19,'salary':20000,'city':'上海'}
r3={'name':'高小五','age':20,'salary':10000,'city':'深圳'}
dic=[r1,r2,r3]
dic[0].get('name')#通过将字典存储为列表的每一行,再对列表进行访问,访问到其中的某一个字典再用get方法获取该字典键对应的值
#打印该列表中所有的元素
for m in range(len(dic)):
for n in dic[m]:
print(dic[m][n],end='\t')#后面加end是希望每一行的数据不换行
print()#这个print在这里的作用是换行
#打印表格中所有的薪资
for m in range(len(dic)):
print(dic[m]['salary'])
字典核心底层原理:
创建字典的核心,将键值对放入字典对象中,首先要计算键的散列值(bin(hase(‘name’)))(计算name的hash值将其转换为二进制(bin))即得出其散列值,将散列值的最后三位数值作为索引值去对应二进制的数,如果对应数对应的字典行为空则放入该行,如果不为空则向前取三个值计算对应行数,再看是否为空,为空则放入对应行,值与键逻辑相同
用法总结:
1. 键必须可散列
(1) 数字、字符串、元组,都是可散列的。
(2) 自定义对象需要支持下面三点:
①支持hash()函数
②支持通过__eq__()方法检测相等性。
③若a==b 为真,则hash(a)==hash(b)也为真。
2. 字典在内存中开销巨大,典型的空间换时间。
3. 键查询速度很快
4. 往字典里面添加新建可能导致扩容,导致散列表中键的次序变化。因此,不要在遍历字
典的同时进行字典的修改。
集合
集合是无序可变的,元素不能重复,集合中所有的元素都是字典中的‘键对象’
集合的创建:1、a={2,5,7}
2、a=(2,5,7) a=[2,5,7]→b=set(a) #使用set方法创建集合时,括号中的对象必须为元组、列表、字符串等可迭代对象,不能直接填入集合的元素
a.add(8) :用add方法向集合a中添加元素,如原集合中存在则保留一个
a.remove(8):用remove方法删除集合a中的某个元素
a.clear():用clear方法清空集合a中的元素
集合的相关操作:并集、交集、差集
并集:a|b 或 a.union(b) #合并两个集合
交集:a&b 或 a.intersection(b)#输出a中和b相同的元素集合
差集:a-b 或 a.difference(b)#从a中减去b的元素
#对a进行变化,加入或减少b中的内容
选择结构(if语句)
p=int(input('请输入一个0-100之间的数字:'))
grade=''
while p>100 or p<0:
p=int(input('输入错误!请重新输入一个0-100之间的数字:'))
continue
if p>=90:
grade='A'
elif p>=80:
grade = 'B'
elif p>=70:
grade = 'C'
elif p>=60:
grade = 'D'
else:
grade = 'E'
print('成绩为{0},等级为{1}'.format(p, grade))
优化后代码:
p=int(input('请输入一个0-100之间的数字:'))
grade='ABCDE'
while p>100 or p<0:
p=int(input('输入错误!请重新输入一个0-100之间的数字:'))
continue
m=p//10
if p==100:
print('成绩为100,等级为A')
elif p<60:
print(f'成绩为{p},等级为E')
else:
print('成绩为{0},等级为{1}'.format(p,grade[9-m]))