目录
1.列表
1.1定义
特别注意!!!
1.2基础操作
1.2.1创建空列表
1.2.2获取元素
1.2.3添加元素
1.2.4删除元素
1.2.5定位元素
1.2.6遍历列表
2.内存图
2.1修改列表元素
2.2修改列表变量
2.3切片
练习1
练习2
练习3
3.浅拷贝与深拷贝
4.列表VS字符串
练习
由一系列变量组成的可变序列容器(字符串是指由一系列字符组成的不可变序列容器)
列表不能一边循环一边删除!!!如果一定要这么做可以倒着来。
练习:删除已知列表中大于10的元素
# 经典错法:
data_list = [9, 25, 12, 8]
for item in data_list:
if item > 10:
data_list.remove(item)
print(data_list) # [9, 12, 8]
# 倒着来,正确做法
data_list = [9, 25, 12, 8]
for item in data_list[::-1]:
if item > 10:
data_list.remove(item)
print(data_list) # [9, 8]
list01 = [] # 根据数据构建列表
list_01 = list() # 根据容器构建列表
list01=["悟空",100,True]
list_01 = list("我是齐天大圣") # ['我', '是', '齐', '天', '大', '圣']
# 索引和切片的作用是定位元素
list01 = ["悟空", 100, True, "八戒", None, 666, '999', False]
# 索引
print(list01[2])
# 切片
print(list01[-4:]) # 取后四个
list01 = ["悟空", 100, True, "八戒", None, 666, '999', False]
list01.append("鲁智深") # 在末尾添加
list01.insert(0,"唐三藏") # 在指定位置添加
list01 = ["悟空", 100, True, "八戒", False]
# 根据元素删除
list01.remove("八戒")
# 根据位置删除
del list01[2]
特别注意:用for循环遍历列表并删除满足条件的元素时,后一个会替换前一个,所以一边循环一边删除会报错。如果一定要这么做,可以倒着来。
定位元素可以增删改查。
list01 = ["悟空", 100, True, "八戒", False]
# 0 1 2 3 4
# 切片
del list01[1:3]
print(list01)
# 修改
list01[1:3]=["鲁智深","武松",666,"999"]
# 删除
list01[1:3] = []
list01 = ["悟空", 100, True, "八戒", False]
# 遍历列表中的所有元素
for item in list01:
print(item)
# 倒序获取所有元素
# 不建议,因为list01[::-1]是在重新创建新列表
# 通过切片拿元素,会重新创建新列表,所有不建议使用
for item in list01[::-1]:
print(item)
# 建议通过索引来做:
list01 = ["悟空", 100, True, "八戒"]
# 0 1 2 3
# 倒序:3 2 1 0 或者 -1 -2 -3 -4
for i in range(len(list01) - 1, -1, -1):
print(list01[i])
for j in range(-1, -len(list01) - 1, -1):
print(list01[j])
list01 = ["张无忌", "赵敏"]
list02 = list01
list01[0] = "无忌"
print(list02) # ['无忌', '赵敏']
list01 = ["张无忌", "赵敏"]
list02 = list01
list01= ["无忌"]
print(list02) # ['张无忌', '赵敏']
注意:通过切片获取元素会创建新列表。
list01 = [800, 1000]
list02 = list01[:] # 切片创建新列表(相当于拷贝列表)
list01[0] = 900
print(list02) # [800, 1000]
list01 = [800, 1000]
list02 = list01[:] # 切片创建新列表(相当于拷贝列表)
list01 = [500]
print(list02) # [800, 1000]
list01 = [800, [1000,500]]
list02 = list01[:] # 切片创建新列表(相当于拷贝列表)
list01[0] = 900
print(list02) # [800, [1000,500]]
# 内存图如下:
list01 = [800, [1000,500]]
list02 = list01
list01[1][0] = 900
print(list02) # [800, [900,500]]
# 内存图如下:
list01 = [800, [1000,500]]
list02 = list01[:]
list01[1][0] = 900
print(list02) # [800, [900,500]]
# 内存图如下:
浅拷贝:复制过程中,只复制一层变量,不会复制深层变量绑定的对象。
默认就是浅拷贝,深拷贝更费内存。
list01 = [800, [1000, 500]]
list02 = list01[:]
list03 = list01.copy()
# list02与list03完全相同
深拷贝:复制整个依赖的变量(一大家子全部复制)
深拷贝之后,无论发生什么变化,原先拷贝变量的对象都不变,深拷贝比较费内存,但要清楚自己的目标,只要值得,费内存也是可以的。
import copy
list01 = [800, [1000, 500]]
list02 = copy.deepcopy(list01)
list01[1][0] = 900
print(list02) # [800, [1000, 500]]
列表和字符串都是序列,元素之间有先后顺序关系。
字符串是不可变的序列,列表是可变的序列。
字符串中每个元素只能存储字符,而列表可以存储任意类型的数据。
列表和字符串都是可迭代对象。
函数:
列表 →字符串:将多个字符串拼接为一个
# "连接符".join(列表)
list01=["孙悟空","猪八戒","沙和尚"]
result = "***".join(list01)
print(result) # 孙悟空***猪八戒***沙和尚
# -----------------------------------------
# 需求:根据逻辑拼接一个字符串,"0123456789"
# 优点:每次循环只向列表添加字符串,没有创建列表对象
data = []
for i in range(10):
data.append(str(i))
string = "".join(data)
print(string)
# 缺点:每次循环形成一个新的字符串对象,替换变量引用result
data = ""
for i in range(10):
data += str(i) # 字符串拼接
print(data)
# -------------------------------------------------
# 练习:在控制台中循环输入字符串,如果输入空字符串则停止,最后打印所有内容
list_temp = []
while True:
content = input("请输入内容:")
if not content:
break
list_temp.append(content)
result = "".join(list_temp)
print(result)
字符串 → 列表:将一个字符串拆分为多个
# "字符串".split("分隔符")
string = "a-b-c-d"
data_list = string.split("-")
print(data_list) # ['a', 'b', 'c', 'd']
# 练习:英文单词翻转
# How are you ---→ you are How
str_input = input("Please input your message in English:")
list_input = str_input.split(" ")
list_input.reverse()
result = " ".join(list_input)
print(result)
1.在控制台中录入西游记中自己喜欢的任务,输入空字符串,打印所有任务(一行一个)
like_list = []
while True:
name = input("请输入在西游记中您喜欢的人物:")
if name:
like_list.append(name)
else:
break
for item in like_list:
print(item)
# 老师讲解
like_list = []
while True:
name = input("请输入在西游记中您喜欢的人物:")
if name =="":
break
like_list.append(name)
for item in like_lise:
print(item)
2.在控制台中录入所有学生成绩,录入空字符串说明已录完,打印所有成绩,计算最高分、最低分及平均分
score_list = []
while True:
score = input("请输入学生成绩(回车表示已录完):")
if not score:
break
score = float(score)
score_list.append(score)
print(score_list)
total = 0
min_score = score_list[0]
max_score = score_list[0]
print("所有学生成绩为:")
for item in score_list:
print(item) # 打印所有学生成绩
total += item
if item < min_score:
min_score = item
if item > max_score:
max_score = item
print()
print("平均分为:", total / len(score_list),sep="")
print("最高分为:",max_score,sep="")
print("最低分为:",min_score,sep="")
# 优化版:
score_list = []
while True:
score = input("请输入学生成绩(回车表示已录完):")
if not score:
break
score = float(score)
score_list.append(score)
print("所有学生的成绩为:")
for item in score_list:
print(item)
mean_score = sum(score_list)/len(score_list)
max_score = max(score_list)
min_score = min(score_list)
text = "平均分为{},最高分为{},最低分为{}".format(mean_score,max_score,min_score)
print(text)
3.在控制台中录入所有学生姓名,如果姓名重复则提示"姓名已存在",不添加,如果录入空字符串则倒序打印所有学生
student_list = []
while True:
name = input("请输入学生姓名:")
if name == "":
break
if name in student_list:
print("该姓名已存在")
else:
student_list.append(name)
print("学生名单为:")
for i in range(1,len(student_list)+1):
i *= (-1)
print(student_list[i])
4.已知某数据列表,将列表中大于30的数字存入另一个列表
data_list = [54, 25, 12, 42, 35, 17]
result = []
for item in data_list:
if item > 30:
result.append(item)
print(result)
# 内存图如下:
5.在控制台中录入五个数字,并打印最大值(不使用内置函数max)
data_list = []
for i in range(5):
data = float(input("请输入数字:"))
data_list.append(data)
print(data_list)
max_data = data_list[0]
for item in data_list:
if item > max_data:
max_data = item
print("最大值为:", max_data)
# 老师讲:如果输入数字是负数会有问题
max_number = 0
for i in range(5):
number = int(input("请输入第%d个数字:" % (i + 1)))
if number > max_number:
max_number = number
print("最大值为:", max_number, sep="")
6.已知某列表,请输出其最大值(不适用内置函数max)
data_list = [54, 25, 12, 42, 35, 17]
max_data = data_list[0]
for item in data_list:
if item > max_data:
max_data = item
print("最大值为:", max_data, sep="")
7.已知某列表,删除列表中大于10的元素
删除列表元素会影响列表的长度,进而会影响列表的for循环,不能边循环边删除
data_list = [9, 25, 12, 8]
for num in data_list[::-1]: # 切片会创建新列表,浪费内存
if num > 10:
data_list.remove(num)
print(data_list)
# -----------------------------------------------
data_list = [9, 25, 12, 8]
for i in range(len(data_list)-1,-1,-1):
if data_list[i] > 10:
del data_list[i]
print(data_list) # [9, 8]
8.计算某已知列表的最小值(不使用内置函数min)
data_list = [9, 25, 12, 8]
result = data_list[0]
for item in data_list:
if item < result:
result = item
print(result)
9.彩票-双色球:
红球:6个,1--33之间的整数,且不能重复
蓝球:1个,1--16之间的整数
(1)随机产生一注彩票[6个红球1个蓝球]
(2)在控制台中购买一注彩票,并提示:
“请输入第1个红球号码:”
”请输入第2个红球号码:“
“号码不在范围内”
“号码已经重复”
“请输入蓝球号码:”
import random
target = random.sample(range(1, 34), 6)
# 随机产生6个红球号码
blue = random.randint(1, 18)
# 随机产生一个蓝球号码
target.append(blue)
# 确定中奖号码
print(target)
print()
print("红球:1-33之间的整数")
buy_in = []
count = 1
while count < 7:
red_in = int(input("请输入第%d个红球号码:" % count))
if red_in in buy_in:
print("该号码已存在,请重新输入!")
elif red_in < 1 or red_in > 33:
print("号码不在范围内,请重新输入!")
else:
buy_in.append(red_in)
count += 1
print()
print("蓝球:1-17之间的整数")
blue_in = int(input("请输入蓝球号码:"))
buy_in.append(blue_in)
print(buy_in)
print()
success = 0
for num in range(7):
if buy_in[num] == target[num]:
success += 1
if success == 7:
print("恭喜您中奖啦!!!")
else:
print("很遗憾,本次您未能中奖!")
# 老师讲解-------------------------------------------------------
import random
target_ticket = []
# 产生6个不重复的红球号码
while len(target_ticket) < 6:
random_number = random.randrange(1, 33)
if random_number not in target_ticket:
target_ticket.append(random_number)
# 产生一个蓝球号码
target_ticket.append(random.randrange(1, 16))
print(target_ticket) # 中奖号码
list_ticket = []
while len(list_ticket) < 6:
number = int(input("请输入第%d个红球号码:" % (len(list_ticket) + 1)))
if number < 1 or number > 33:
print("号码不在范围内")
elif number in list_ticket:
print("号码已经重复")
else:
list_ticket.append(number)
while True:
number = int(input("请输入蓝球号码:"))
if 0 < number <= 16:
list_ticket.append(number)
break
print("号码不在范围内")
print(list_ticket)
if list_ticket != target_ticket:
print("很遗憾未能中奖!")
else:
print("恭喜您中奖啦!!!")