1.今日内容大纲
一. 回顾昨日内容
1. 列表的定义:
能装对象的对象. 由[]表示. 内部使用逗号隔开
索引和切片 . 从0开始
[start: end: step]
2. 增删改查
1. 新增: append(), insert(), extend()迭代添加
2. 删除: pop(), remove(), clear(), del 元素
3. 修改: 索引或切片修改
4. 查询: 索引查询 for el in list:
5. 操作: count(), index(), find(), sort(reverse=True), reverse()
3. 元组(tuple):
由()表示. 内部用逗号隔开.
不可变, 只读列表
不可变指的是第一层元素.
不可变的数据类型: int, str, bool, (元组)
4. range()
range(10) 0-9
range(1, 12) 1-11
range(1,12, 3) 1 4 7 10
for el in list: # 没有索引
for i in range(len(list)):
list[i]
二. 作业讲解
三. 今日主要内容
1. 什么是字典
dict. 以{}表示. 每一项用逗号隔开, 内部元素用key:value的形式来保存数据
{"jj":"林俊杰", "jay":"周杰伦"}
查询的效率非常高, 通过key来查找元素
内部使用key来计算一个内存地址(暂时),hash算法. key必须是不可变的数据类型(key 必须是可哈希的数据类型)
可哈希就是不可变
2. 字典的增删改查
1. 字典的新增:
dict[新key] = value
dict.setdefault()
2. 删除
pop(key)
popitem()
clear()
del dict[key]
3. 修改
dic[key] = 新值
update()
4. 查询
1. 用key直接查询 dict[key]
2. get(key, 如果key不存在返回的数据)
3. setdefault() 1. 执行新增流程. 2. 查询结果
5. 操作
1. keys() 获取所有键 这个返回的不是列表, 很像列表
2. values()获取所有的值
3. items() 获取所有的键值对. 返回的是元组
解构, 直接把元组或者列表中的数据拿出来.
a, b, c = (a1, b1, c1) 必须一一对应
6. 遍历字典
for key in dict:
dict[key]
for k, v in dict.items():
k , v
7. 字典嵌套.
预习:
1. == 和 is 的区别(小数据池)
2. 再谈编码(decode(), encode())
建议: 1. 本周作业过一遍. 大作业 2. 玩儿. 回来之后.预习一下. 大作业
2.练习
'''
day4作业及默写
1,写代码,有如下列表,按照要求实现每⼀个功能
li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
1)计算列表的⻓度并输出
2)列表中追加元素"seven",并输出添加后的列表
3)请在列表的第1个位置插⼊元素"Tony",并输出添加后的列表
4)请修改列表第2个位置的元素为"Kelly",并输出修改后的列表
5)请将列表l2=[1,"a",3,4,"heart"]的每⼀个元素添加到列表li中,⼀⾏代码实
现,不允许循环添加。
6)请将字符串s = "qwert"的每⼀个元素添加到列表li中,⼀⾏代码实现,不
允许循环添加。
7)请删除列表中的元素"eric",并输出添加后的列表
8)请删除列表中的第2个元素,并输出删除的元素和删除元素后的列表
9)请删除列表中的第2⾄4个元素,并输出删除元素后的列表
10)请将列表所有得元素反转,并输出反转后的列表
11)请计算出"alex"元素在列表li中出现的次数,并输出该次数。
2,写代码,有如下列表,利⽤切⽚实现每⼀个功能
li = [1, 3, 2, "a", 4, "b", 5,"c"]
1)通过对li列表的切⽚形成新的列表l1,l1 = [1,3,2]
2)通过对li列表的切⽚形成新的列表l2,l2 = ["a",4,"b"]
3)通过对li列表的切⽚形成新的列表l3,l3 = ["1,2,4,5]
4)通过对li列表的切⽚形成新的列表l4,l4 = [3,"a","b"]
5)通过对li列表的切⽚形成新的列表l5,l5 = ["c"]
6)通过对li列表的切⽚形成新的列表l6,l6 = ["b","a",3]
3,写代码,有如下列表,按照要求实现每⼀个功能。
lis = [2, 3, "k", ["qwe", 20, ["k1", ["tt", 3, "1"]], 89], "ab", "adv"]
1)将列表lis中的"tt"变成⼤写(⽤两种⽅式)。
2)将列表中的数字3变成字符串"100"(⽤两种⽅式)。
3)将列表中的字符串"1"变成数字101(⽤两种⽅式)。
4,请⽤代码实现:
li = ["alex", "eric", "rain"]
利⽤下划线将列表的每⼀个元素拼接成字符串"alex_eric_rain"
5.利⽤for循环和range打印出下⾯列表的索引。
li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
6.利⽤for循环和range找出100以内所有的偶数并将这些偶数插⼊到⼀个新列表
中。
7.利⽤for循环和range 找出50以内能被3整除的数,并将这些数插⼊到⼀个新列
表中。
8.利⽤for循环和range从100~1,倒序打印。
9.利⽤for循环和range从100~10,倒序将所有的偶数添加到⼀个新列表中,然
后对列表的元素进⾏筛选,将能被4整除的数留下来。
10,利⽤for循环和range,将1-30的数字⼀次添加到⼀个列表中,并循环这个
列表,将能被3整除的数改成*。
11,查找列表li中的元素,移除每个元素的空格,并找出以"A"或者"a"开头,并
以"c"结尾的所有元素,并添加到⼀个新列表中,最后循环打印这个新列表。
li = ["TaiBai ", “ale xC", “AbC ", "egon", " ri TiAn", "WuSir", " aqc"]
12,开发敏感词语过滤程序,提示⽤户输⼊评论内容,如果⽤户输⼊的内容中
包含特殊的字符:
敏感词列表 li = ["苍⽼师", "东京热", "武藤兰", "波多野结⾐"]
则将⽤户输⼊的内容中的敏感词汇替换成等⻓度的*(苍⽼师就替换***),并添
加到⼀个列表中;如果⽤户输⼊的内容没有敏感词汇,则直接添加到上述的列
表中。
13,有如下列表
li = [1, 3, 4, "alex", [3, 7, 8, "TaiBai"], 5, "RiTiAn"]
循环打印列表中的每个元素,遇到列表则再循环打印出它⾥⾯的元素。
我想要的结果是:
1
3
4
"alex"
3
7,
8
"taibai"
5
ritian
14. 把班级学⽣数学考试成绩录⼊到⼀个列表中: 并求平均值. 要求: 录⼊的时候
要带着⼈名录⼊, 例如: 张三_44
15. 敲七游戏. 从0开始数数. 遇到7或者7的倍数要在桌上敲⼀下. 编程来完成敲
七
16. (升级题) 编写程序. 完成⼼动⼥⽣的筛选. (升级题)
⾸先. 程序会提示⽤户录⼊10位⼼仪⼥⽣的姓名. 然后把10位⼥⽣的名
字和序号展示出来. 由⽤户选择⼼动⼥⽣. 此时⽤户可以选择3个⼼动⼥⽣. 把⽤
户选中的三个⼼动⼥⽣的名字打印出来. 供⽤户继续选择. 这⼀次选择. 只能选
择⼀名⼥⽣. 然后输出⽤户的⼼动⼥⽣是xxx
运⾏效果:
明⽇默写内容
1,将列表的增删改查不同的⽅法全部写出来,
例如:增:有三种,append:在后⾯添加。Insert按照索引添加,
extend:迭代着添加。
2,默写第,13题的实现的代码。
'''
# li = ["alex", "WuSir", "ritian", "barry", "wenzhou", "eric"]
#
# l2=[1,"a",3,4,"heart"]
# # print(len(li))
# # li.append("seven")
# li.extend(l2)
# li.remove(li[2])
# li.pop(2)
# print(li)
# li = [1, 3, 2, "a", 4, "b", 5,"c"]
# # ["c"]
# print(li[-1:])
# lis = [2, 3, "k", ["qwe", 20, ["k1", ["tt", 3, "1"]], 89], "ab", "adv"]
# lis[3][2][1][0] = lis[3][2][1][0].upper()
# lis[3][2][1][0] = "TT"
# lis[3][2][1][0] = lis[3][2][1][0].replace("t", "T")
# lis[3][2][1][0] = lis[3][2][1][0].swapcase()
# lis[3][2][1][1] = "100"
# lis[3][2][1][1] = str(lis[3][2][1][1] + 97)
# lis[3][2][1][2] = int(lis[3][2][1][2] + "01")
# lis[3][2][1][2] = 101
# lis[3][2][1][2] = int(lis[3][2][1][2]) + 100
# print(lis)
# li = ["alex", "eric", "rain", "刘伟","你很六"]
# # 1+2+3+4+5....
# s = ""
# for el in li: # el 列表中的每一个字符串
# s = s + el + "_"
# print(s[:-1])
#
# li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
# for i in range(len(li)):
# print(i)
# lst = []
# for i in range(50):
# if i % 3 == 0:
# lst.append(i)
#
# print(lst)
# for i in range(100, 0, -1):
# print(i)
# lst = []
# for i in range(100, 9, -1):
# if i % 2 == 0 and i % 4 == 0:
# lst.append(i)
# print(lst)
# lst = []
# for i in range(1, 30):
# lst.append(i)
#
# for i in range(len(lst)):
# if lst[i] % 3 == 0:
# lst[i] = "*"
# print(lst)
# 查找列表li中的元素,移除每个元素的空格,并找出以"A"或者"a"开头,并
# 以"c"结尾的所有元素,并添加到⼀个新列表中,最后循环打印这个新列表。
# li = ["TaiBai ", "ale xC", "AbC ", "egon", " ri TiAn", "WuSir", " aqc"]
#
# lst = []
# for el in li:
# el = el.replace(" ", "") # 去掉空格的
# if el.upper().startswith("A") and el.endswith("c"):
# lst.append(el)
# print(lst)
# 敏感词列表 li = ["苍⽼师", "东京热", "武藤兰", "波多野结⾐"]
# 则将⽤户输⼊的内容中的敏感词汇替换成等⻓度的*(苍⽼师就替换***),并添
# 加到⼀个列表中;如果⽤户输⼊的内容没有敏感词汇,则直接添加到上述的列
# 表中。
# li = ["苍老师", "东京热", "武藤兰", "波多野结衣"]
# content = input("请开始你的评论:")
# for el in li:
# if el in content:
# content = content.replace(el, "*"*len(el))
# print(content)
# print(list)
# print(type([]))
# li = [1, 3, 4, "alex", [3, 7, 8, "TaiBai"], 5, "RiTiAn", [3, 7, 8, "TaiBai"]]
# for el in li:
# if type(el) == list:
# for el2 in el:
# if type(el2) == str:
# print(el2.lower())
# else:
# print(el2)
# else:
# if type(el) == str:
# print(el.lower())
# else:
# print(el)
# for i in range(len(li)):
# if i != 4:
# print(li[i])
# else: # 第四个是列表. 继续循环
# for el in li[4]:
# print(el)
# lst = []
# while 1:
# info = input("请输入学生信息(Q退出):") # 张三_44
# if info.upper() == "Q":
# break
# lst.append(info)
# sum = 0
# for el in lst: # 张三_44
# sum += int(el.split("_")[1])
#
# print(sum/len(lst))
# 敲七
# n = int(input("请输入数字n:"))
# lst = []
# for i in range(1, n+1):
# if i % 7 == 0 or "7" in str(i):
# lst.append("咣")
# else:
# lst.append(i)
# print(lst)
3.字典
dic = {"jj":"林俊杰", "jay":"周杰伦","tz":"陶喆", 1:"哈哈", (1,2,3):"胡辣汤"} # unhashable type: 'list'
print(dic)
4.字典的新增
# dic = {}
# # 徐峥:人在囧途
# dic['徐峥'] = "人在囧途" # 直接用key往里面存数据即可
# dic['黄渤'] = "疯狂的石头"
# dic["王宝强"] = "天下无贼"
# dic["王宝强"] = "士兵突击" # 如果key已经存在。 那么会替换掉原来的value, 修改
#
# dic.setdefault("黄秋生")
# dic.setdefault("黄秋生", "无间道") # 如果存在了key, 不会执行新增
#
# print(dic)
5.字典的删除
dic = {"黄日华": "天龙八部", "吕颂贤": "笑傲江湖", "苏有朋": "倚天屠龙记", "六小龄童": "西游记"}
# dic.pop("吕颂贤") # 指定key删除
# dic.popitem() # 随机删除
# del dic["黄日华"] # 删除
# dic.clear() # 清空字典
print(dic)
6.字典的修改和查询
dic = {"刘能": "王小利", "赵四": "刘晓光", "王木生": "范伟", "谢大脚": "于月仙", "李大国": "小鬼"}
# dic['王木生'] = "刘伟"
dic2 = {"刘能": "大阳哥", "赵四": "github", "王木生": "汪峰", "谢大脚": "冯提莫", "王大拿": "金老板"}
dic.update(dic2)
print(dic)
# 查询
dic = {'刘能': '大阳哥', '赵四': 'github', '王木生': '汪峰', '谢大脚': '冯提莫', '李大国': '小鬼', '王大拿': '金老板'}
# 1. 最直观。 直接用key
print(dic['周杰伦']) # 当这个key不存在的时候会报错
# 2. get方法
print(dic.get("谢大脚", "周杰伦不在这里")) # 没有key. 返回None
# 3. setdefault() 1. 新增(先看有没有key, 如果有就过, 如果没有,执行新增) 2.根据key把值返回
dic = {}
dic["盖伦"] = "德玛西亚之力"
value = dic.setdefault("菲奥娜", "无双剑姬") # 新增
value2 = dic.setdefault("盖伦", "刘伟") # 由于已经存在了key。 所以新增不执行。 直接查询结果
value3 = dic.setdefault("薇恩", "坑")
print(value3)
print(dic)
7.字典的相关操作
dic = {"汪峰": "大陆音乐半壁江山", "周杰伦": "亚洲音乐天王", "罗志祥": "亚洲舞王"}
# 对字典的遍历
# print(dic.keys()) # dict_keys(['汪峰', '周杰伦', '罗志祥']) 像列表但不是列表
# for key in dic.keys():
# print(key) # 拿到key
# print(dic[key]) # 拿到value
# print(dic.values())
# for value in dic.values():
# print(value)
# 也可以遍历字典
# [('汪峰', '大陆音乐半壁江山'), ('周杰伦', '亚洲音乐天王'), ('罗志祥', '亚洲舞王')]
# print(dic.items()) # 拿到的是key和value
for k, v in dic.items(): # 当需要遍历字典. 在操作中涉及到key和value的时候.
print(k) # 元组
print(v)
# 字典本身是一个可迭代对象,可以直接进行for循环
for el in dic: # 直接拿到key
print(el)
print(dic[el])
# 前面的变量的个数和后面解包的个数一致
# a, b = (10, 20) # 解构, 解包
# print(a)
# print(b)
8.字典的嵌套
wf = {
"name": "汪峰",
"age": 48,
"成名曲": "春天里",
"wife": {
"name": "章子怡",
"age": 39,
"工作": "演员"
},
"children":[
{"num": "001", "name": "汪一", "hobby": "唱歌"},
{"num": "002", "name": "汪二", "hobby": "演戏"} # wf['children'][1]['name']
]
}
# wf['wife']['age'] = wf['wife']['age'] + 10
# print(wf)
9.其他
# 创建并输出菜单, 菜单是不可变的. 所以使用元组
# menus = ("1, 录入", "2, 查询", "3, 删除", "4, 修改", "5, 退出")
#
# 存储用户的信息 id: {'name':'名字', 'weight':体重, 'height':身高}
# 例如:目前有两个用户信息:1. 汪峰, 2. 章子怡
# 推荐存储结构:
# bodies = {
# 1:{'name':'汪峰', 'weight':80, 'height':1.8, 'BMI':24.7},
# 2:{'name':'章子怡', 'weight':50, 'height':1.65, 'BMI':18.4}
# }
# bodies = {}
#
# body_id = 1 # 编号从1开始
#
# 体质指数(BMI)= 体重(kg)÷ (身高(m) x 身高(m))
# 体重的单位: KG
# 身高的单位: m
# 需求:
# 首先。打印菜单,然后用户输入选择的菜单项
# 输入1:进入录入环节。用户需要录入:名字,身高,体重.
# 由程序计算出BMI指数. 保存到bodies字典中. 第一个用户的id是1, 第二个是2, 以此类推
# 录入完毕后. 提示用户是否继续录入. 如果选择是, 则继续进行录入, 直到用户输入否. 则返回到主菜单
# 输入2: 进入查询环节, 提示用户输入要查询的人的id. 如果不存在,给与提示, 如果存在. 则显示出该用户的全部信息(名字,身高,体重,BMI)
# 然后提示用户是否继续查询. 如果选择是, 继续进行查询, 直到用户输入否, 返回主菜单
# 输入3: 进入删除环节, 提示用户输入要删除的人的id, 如果id不存在, 给与提示, 如果存在, 则执行删除操作. 并提示删除成功.
# 然后提示用户是否继续删除, 如果是, 继续让用户选择要删除的id, 直到用户输入否, 返回主菜单
# 输入4: 进入修改环节, 首先让用户输入要修改的人的id, 根据id查找用户信息, 如果不存在, 给与提示, 如果存在, 将用户原信息进行打印,
# 然后提示用户输入新的名字, 身高, 体重. 由程序重新计算BMI指数. 并将新的信息保存在bodies中. 同时给用户展示新的用户信息
# 然后提示用户是否继续修改, 如果是, 则继续要求用户输入id信息. 直到用户输入否, 返回主菜单.
# 输入5: 程序退出.
#
# 输入其他任何内容. 都予以提示不合法. 让用户重新进行输入
while 1:
print("- - - - - - - - - - - 此处是菜单 - - - - - - - - - - -")
menus = ("1, 录入", "2, 查询", "3, 删除", "4, 修改", "5, 退出")
print(menus)
print("- - - - - - - - - - - 此处是菜单 - - - - - - - - - - -")
userInputCode = input("请输入菜单序号:")
case = ["1", "2", "3", "4", "5"]
bodies0 = {}
if userInputCode == case[0]:
userId = 1
bodies = {}
while 1:
personBody = {}
userName = personBody["name"] = input("请输入用户NAME:")
userWeight = personBody['weight'] = input("请输入用户WEIGHT:")
userHeight = personBody['height'] = input("请输入用户HEIGHT:")
userBMI = personBody['BMI'] = str(float(userWeight)/((float(userHeight))**2))
print(personBody)
bodies[userId] = personBody
userId += 1
if input("是否继续录入(Y/N):").strip().upper() == "Y":
continue
else:
break
# print(bodies)
elif userInputCode == case[1]:
while 1:
el = []
for key in bodies:
el.append(key)
# print(el)
queryId = int(input("请输入要查询的用户ID:").strip())
if queryId in el:
print("信息如下{}:".format(bodies[queryId]))
else:
print("请从当前列表{}选择你要查询的ID信息".format(el))
continue
if input("是否继续查询(Y/N):").strip().upper() == "Y":
continue
else:
break
elif userInputCode == case[2]:
while 1:
el = []
for key in bodies:
el.append(key)
# print(el)
delId = int(input("请输入要删除的用户ID:").strip())
if delId in el:
bodies.pop(delId)
print("删除成功")
# print(bodies)
else:
print("请从当前列表{}选择你要删除的ID的信息".format(el))
break
if input("是否继续删除(Y/N):").strip().upper() == "Y":
continue
else:
break
elif userInputCode == case[3]:
while 1:
el = []
for key in bodies:
el.append(key)
# print(el)
modifyId = int(input("请输入要修改的用户ID:").strip())
if modifyId in el:
print("ID为{}的人的信息为{}".format(modifyId,bodies.get(modifyId)))
userName = bodies[modifyId]["name"] = input("请输入用户NAME:")
userWeight = bodies[modifyId]['weight'] = input("请输入用户WEIGHT:")
userHeight = bodies[modifyId]['height'] = input("请输入用户HEIGHT:")
userBMI = bodies[modifyId]['BMI'] = str(float(userWeight)/((float(userHeight))**2))
print("修改之后用户的信息为:{}".format(bodies[modifyId]))
else:
print("请从当前列表{}选择你要修改的ID的信息".format(el))
break
if input("是否继续修改(Y/N):").strip().upper() == "Y":
continue
else:
break
elif userInputCode == case[4]:
break
else:
print("输入不合法,请重新输入!")
continue