day5 字典和字符
1.字典
1)字典和列表的选择
""" 如果需要同时保存多个意义相同的数据使用列表; 同时保存多个意义不同的数据就使用字典。 """
2) 什么是字典
""" 1). 字典是容器型数据类型;将{}作为容器的标志,里面多个键值对(元素)用逗号隔开: {键1:值1,键2:值2……} 2). 字典是可变的 字典是无序的 3). 字典的元素必须是键值对 键: 必须是不可变的类型的数据(字符串、数字、布尔、元组等,一般使用字符串作为键) 键是唯一的:一个字典中同一个键只能出现一次 值: 可以是任何类型的数据 """
# 1)空字典
d1 = {}
# 2)字典是无序的
print({'a': 10, 'b': 20} == {'b': 20, 'a': 10})
# 3)字典的键必须是不可变类型的数据
# d2 = {'a': 10, 'b': 20, [10,9]: 2} 会报错,因为列表是可变的,不能作为键(字典也不能作为键)
# 4)键是唯一的
d2 = {'a': 10, 'a': 100, 'b': 20}
print(d2)
# 输出结果为{'a': 100, 'b': 20},只保存了一个a的值
# 5)值可以是任何类型的数据
stu = {'name': '小明', 'gender': '男', 'age': 18, 'height': 97, '体重': 40, 'score': 67}
class1 = {
'name': 'python2301',
'teacher': {'name':'余婷','age':18,'tel':'16754321865'},
'students':[{'name':'小马','age':18,'专业':'计算机'},
{},
{}
]
}
# 老师的键对应的值是字典
# 学生的键对应的是列表,列表中每一个字典表示一个学生的信息
2. 字典的增删改查
1). 查
获取字典的值
a. 查单个
字典[键]
dog = {'name': '旺财', 'age': 3, 'breed': '土狗', 'color': '黄色'}
print(dog['name'])
class1 = {
'name': 'python2301',
'teacher': {'name': '余婷', 'age': 18, 'tel': '13678192302'},
'students': [
{'name': 'stu1', 'age': 19, 'school': '清华大学', '专业': '经济', 'contact': {'name': '张三', 'tel': '110'}},
{'name': 'stu2', 'age': 28, 'school': '北京大学', '专业': '大数据', 'contact': {'name': '李四', 'tel': '192'}},
{'name': 'stu3', 'age': 22, 'school': '厦门大学', '专业': '计算机', 'contact': {'name': '王五', 'tel': '920'}},
{'name': 'stu4', 'age': 17, 'school': '南京大学', '专业': '物联网', 'contact': {'name': '赵六', 'tel': '2833'}},
]
}
# 1)获取班级名称
print(class1['name'])
# 2)获取讲师的名字
print(class1['teacher']['name'])
# 3)获取所有学生的名字和对应的学校
for i in class1['students']:
print(i['name'],i['school'])
# 4)获取未成年学生的名字
for i in class1['students']:
if i['age'] < 18:
print(i['name'])
# 5)获取所有学生的联系人的电话
for i in class1['students']:
print(i['contact']['tel'])
# 6)获取第一个学生的联系人的电话
print(class1['students'][0]['contact']['tel'])
遍历, 字典一般不遍历
for 变量 in 字典:
循环体
dog = {'name': '旺财', 'age': 3, 'breed': '土狗', 'color': '黄色'}
for i in dog:
print(i) # 遍历字典依次获取的是所有的键,并没有值
for i in dog:
print(i, dog[i]) # 由键可以得到相应的值
2) 增 改
字典[键]=值 -----若键不存在则增加;存在则修改
字典.setdefault(键,值)------只能添加
# 案例:给所有没有折扣的商品添加discount的值为1
goods_list = [
{'id': 'g001', 'price': 89, 'count': 100},
{'id': 'g001', 'price': 207, 'count': 50, 'discount': 0.9},
{'id': 'g001', 'price': 102, 'count': 33},
{'id': 'g001', 'price': 25, 'count': 897, 'discount': 0.88}
]
for i in goods_list:
i.setdefault('discount', 1)
print(goods_list)
3) 删
del 字典[键] :删除指定键对应的键值对
字典.pop(键): 取走字典中指定键对应的值,键也随之没有了
dog = {'name': '旺财', 'age': 3, 'breed': '土狗', 'color': '黄色'} del dog['breed'] print(dog) result = dog.pop('color') print(dog) print(dog, result)
4).字典相关操作
in 和 not in
键 in 字典------判断字典中是否存在指定的键
d1 = {'a': 10, 'b': 20, 'c': 30} print(10 in d1) # False print('a' in d1) # True
3. 字符串
1) 什么是字符串
'''
1) 字符串是容器型数据类型 :同时保存多个文字符号;将单引号或双引号作为容器的标志
引号中的每个符号就是字符串的每个元素,表情符号也可以是元素
例如:str1='a,v.c'共5个元素,其中逗号和点也是元素
2) 字符串是不可变的;字符串是有序的
3) 元素:引号中的每个独立的符号
字符串的元素又叫字符
可以是任何国家任何民族的任何语言的符号,还可以是转义字符
'''
对于打印出来和在字符串中表示的相同的是普通符号
2) 转义字符
4) 转义字符 - 在特定的符号前加入 \ 来表示特殊功能或者特殊意义
\n : 换行
\t : 缩进四个空格(又叫水平制表符,功能相当于tab键)
' : 表示一个普通的单引号
" : 表示一个普通的双引号
\ : 表示一个普通的反斜杠\
# str1 = 'it's me' 会报错
# 解决办法1
str1 = "it's me"
print(str1)
# 解决办法2
str2 = 'it\'s me'
print(str2)
str3 = 'I say:"good!"'
print(str3)
str4 = "I say:\"good!\""
print(str4)
str5 = '\\nabc' # 想输出\nabc ,防止\n发挥换行功能
print(str5)
3) 查
查单个 :字符串[下标]
遍历:(和列表相同)
for 变量 in 字符串:
循环体
for 变量 in range(len(字符串)):
循环体
str2 = 'abc123'
for i in str2:
print(i) # 这里的1、2、3并不是数字
4) 相关操作
加法运算 即合并
# 案例:在字符串str4中的每个字符后面添加一个*
s = 'abc'
new_s = ''
for i in s:
new_s += i + '*'
print(new_s)
乘法运算
字符串 N N字符串 (将字符串中元素重复N次产生一个新的字符串)
比较运算:比较第一对不相等的字符的大小
已知字符x:
判断x是否是数字字母:'0'<= x< ='9'
判断x是否是小写字母:'a'<= x< ='z'
判断x是否是大写字母:'A'<= x< ='Z'
判断x是否是字母:'a'<= x< ='z' or 'A'<= x< ='Z'
# 案例:提取字符串中所有不是数字字符的字符
str1 = '7gs82b5sv445/l3j2l0'
new_s2 = ''
for i in str1:
if not '0' <= i <= '9':
new_s2 += i
print(new_s2)
in 和 not in
和列表、字典都不一样
字符串1 in 字符串2 ----- 判断字符串是否是字符串2的子串
str1 = 'abc123'
print('a' in str1) # True
print('ab' in str1) # True
print('ac' in str1) # False
作业
输入一个字符串,打印所有奇数位上的字符(下标是1,3,5,7…位上的字符)
例如: 输入**'abcd1234 ' ** 输出**'bd24'**
str1 = 'abcd1234'
str2 = ''
for i in range(1,len(str1),2):
str2 += str1[i]
print(str2)
输入用户名,判断用户名是否合法(用户名长度6~10位)
str1 = input('请输入用户名:')
if len(str1) < 6 or len(str1) > 10:
print('用户名不合法')
输入用户名,判断用户名是否合法(用户名中只能由数字和字母组成)
例如: 'abc' — 合法 '123' — 合法 ‘abc123a’ — 合法
str1 = input('请输入用户名:')
for i in str1:
if ((not '0'<=i<='9')and(not 'a'<=i<='z'))and (not 'A'<=i<='Z'):
print('用户名不合法')
break
输入用户名,判断用户名是否合法(用户名必须包含且只能包含数字和字母,并且第一个字符必须是大写字母)
例如: 'abc' — 不合法 '123' — 不合法 'abc123' — 不合法 'Abc123ahs' — 合法 'Abc' — 不合法
str1 = input('请输入用户名:')
for i in str1:
if ((not '0'<=i<='9')and(not 'a'<=i<='z'))and (not 'A'<=i<='Z') or (not 'A'<='str[0]'<='Z'):
print('用户名不合法')
break
输入一个字符串,将字符串中所有的大写字母取出来产生一个新的字符串
例如:输入**'abFc1shj2A3klBs99+2kDkk'** 输出:**'FABD'**
str1 = 'abFc1shj2A3klBs99+2kDkk'
str2 = ''
for i in str1:
if 'A'<=i<='Z':
str2 += i
print(str2)
输入字符串,将字符串的开头和结尾变成'+',产生一个新的字符串
例如: 输入字符串**'abc123', 输出'+bc12+'**
str1 = 'abc123'
str2 = '+'
for i in range(1,len(str1)-1):
str2 += str1[i]
str2 += '+'
print(str2)
输入字符串,获取字符串的中间字符
例如: 输入**'abc1234'** 输出:'1' 输入**'abc123'** 输出**'c1'**
str1 = 'abc123'
str2 = ''
if len(str1)%2 == 0:
str2 = str1[len(str1)//2-1]+str1[len(str1)//2]
else:
str2 = str1[len(str1)//2]
print(str2)
(难)写程序实现字符串函数find/index的功能(获取字符串1中字符串2第一次出现的位置)
例如: 字符串1为:how are you? Im fine, Thank you! , 字符串2为:you, 打印8
str1 = 'how are you? Im fine, Thank you!'
str2 = 'you'
for i in range(len(str1)):
if str1[i] == str2[0]:
k = i
for j in range(1,len(str2)):
k += 1
if str1[k] == str2[j]:
print(i)
break
break
获取两个字符串中公共的字符
例如: 字符串1为:abcaaa123, 字符串2为: huak3 , 打印:公共字符有:a3
str1 = 'abcaaa123'
str2 = 'huak3'
str3 = ''
for i in str2:
if i in str1:
str3 += i
print('公共字符有',str3)
定义一个变量保存一个学生的信息,学生信心中包括:姓名、年龄、成绩(单科)、电话、性别
student={'name':'小华','age':18,'score':99,'tel':'13425823432','gender':'男'}
print(student)
定义一个列表,在列表中保存6个学生的信息(学生信息中包括: 姓名、年龄、成绩(单科)、电话、性别(男、女、不明) )
统计不及格学生的个数
count = 0
for i in students:
if i['score'] <60:
count +=1
print(count)
打印不及格未成年学生的名字和对应的成绩
for i in students:
if i['score'] <60 and i['age']<18:
print(i['name'],i['score'])
求所有男生的平均年龄
a = 0
count=0
for i in students:
if i['gender']== '男':
a += i['age']
count +=1
print(a/count)
打印手机尾号是8的学生的名字
for i in students:
if i['tel'][-1]== '8':
print(i['name'])
打印最高分和对应的学生的名字
num =[]
for i in students:
num.append(i['score'])
print(max(num))
删除性别不明的所有学生
new_students=students*1
for i in students:
if i['gender'] =='不明':
new_students.remove(i)
print(new_students)
将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)
new_students=[]
num=[]
for i in students:
num.append(i['score'])
num=sorted(num,reverse=True)
for i in num:
for j in students:
if i == j['score']:
new_students.append(j)
print(new_students)