适用场合
列表:可以顺序的存数据
元组:不能改的用它
字典:key和value,键值对
练习1:
a = [-1,2,3,-3,0,-5,5]
生成一个新列表,-1的左边都是小于它的,右边都是大于它的。不需要有序
a = [-1,2,3,-3,0,-5,5]
base = a[0]
a1 = []
a2 = []
for i in a[1:]:
if i<=base:
a1.append(i)
else:
a2.append(i)
print(a1+[base]+a2)
a = [-1,2,3,-3,0,-5,5]将列表元素倒序输出:
for i in range(len(a)-1,-1,-1):
print(a[i])
按坐标倒序取,len(a)-1取最后一个元素坐标,第二个-1因为range的右边是开区间,如果是0就取不到第一个坐标值,第三个-1表示步长按倒序。
在列表a = [-1,2,3,-3,0,-5,5]中实现每个元素+1,需要在原列表实现。
a = [-1,2,3,-3,0,-5,5]
for i in range(len(a)):
a[i]+=1
print(a)
1、在列表中插入一个新的元素
[100,2,3,-3,0,-5,5]在0的前面插入一个元素10000
算法:
遍历,判断是否是0,不是0,把元素插入新列表
是0,则把待插入元素插入新列表,然后再插入0
result = []
a = [100,2,3,-3,0,-5,5]
target_num = 10000
for i in a:
if i == 0:
result.append(target_num)
result.append(i)
else:
result.append(i)
print(result)
2、在列表中的第三个位置插入10000
算法:
使用切片把第三个位置前的取到
使用切片把位置三后的取到
把10000存到列表,三个列表相加
result = []
a = [100,2,3,-3,0,-5,5]
target_num = 10000
result = a[:2]+[target_num]+a[2:]
print(result)
练习:
[1,-1,2,-2,3,-3] max()排序
算法:
每次找到最大的存到新的list
在老的list里面删掉一个
继续重复上面的过程,知道所有的元素都到新list
1、降序
a = [1,-1,2,-2,3,-3]
result = []
for i in range(len(a)):
result.append(max(a))
a.remove(max(a))
print(result)
2、升序
a = [1,-1,2,-2,3,-3]
result = []
for i in range(len(a)):
result.insert(0,max(a))
a.remove(max(a))
print(result)
a = “abcdefghi”
把开头、结尾、中间位置的字母变为1,其他字母不变
a = "abcdefghi"
a = list(a)
a[0] = '1'
a[-1] = '1'
mid = len(a)//2
if len(a)%2 == 0:
a[mid] = '1'
a[mid-1] = '1'
else:
a[mid] = '1'
print("".join(a))
按照序列的长度倒序排序
a = [(1,),(1,1),(1,2,3),(2,2)]
def func(b):
return len(b)
a.sort(key = func)
print(a)
降序用reverse=True
a = [(1,),(1,1),(1,2,3),(2,2)]
def func(b):
return len(b)
a.sort(key = func,reverse = True)
print(a)
使用元组的第一个值大小实现列表排序
a = [(-1,),(1,1),(-2,2,3),(2,2)]
a = [(-1,),(1,1),(-2,2,3),(2,2)]
def func(b):
return b[0]
a.sort(key = func)
print(a)
请使用元组中的所有元素的和,对下面列表的元素进行排序。
a = [(-1,),(1,1),(-2,2,3),(2,2)]
def func(b):
return sum(b)
a.sort(key = func)
print(a)
找到英文句子中字母最长的单词。
算法1:
1 使用空格分割列表
2 遍历列表的每个单词
3 max_length = 0
4 max_word = “”
s = "I am a boy! hi , glory road hello"
word_list = s.split()
max_length = 0
max_word = []
for word in word_list:
if len(word)>max_length:
max_length = len(word)
max_word = [word]
elif len(word) == max_length:
max_word.append(word)
print(max_word)
算法2:
1 使用空格分割列表
2 写一个函数,算出每个单词的长度
3 使用sort基于每个单词的长度进行排序
4 切片取最后一个
s = "I am a boy! hi , glory road hello"
word_list = s.split()
word_list.sort(key = lambda x:len(x))
for word in word_list:
if len(word) == len(word_list[-1]):
print(word)
列表的赋值有两种方式:
引用赋值----他们的内存地址是相同的,修改任何一个list,另一个list中的值都会被改变。
非引用赋值----
他们的内存地址不一样,所以修改任何一个list都不会影响两一个list。(切片赋值)
小练习:
生成一个学生资料库:
每个学生:名字 班级 考试成绩(科目名称,成绩)
[名字 班级 考试成绩 [科目名称1,成绩]… ]
请实现一个学生信息和成绩的录入,以及查询以及更新和删除。
提示:每一个操作写一个函数,例如:add_info()当用户输入add_info的时候,调用此函数。在函数内部,再实现用户输入名字和班级。
print("欢迎来到熊孩子成绩管理系统!")
print("""
可操作的命令如下:
add_info: 可以添加学生的名字和班级
add_grade: 可以增加学生的考试成绩
modify_grade: 可以修改学生的考试成绩
get_grade: 可以获得学生的某个学科考试成绩
delete_grade: 可以删除学生的某个学科考试成绩
""")
xionghaizi_info = []
def add_info(info):
if len(info) > 0:
print("信息已存在!")
return
name = input("请输入学生的名字:")
info.append(name)
class_info = input("请输入学生的班级:")
info.append(class_info)
def add_grade(info):
if len(info) >= 3:
subject = input("请输入学生的考试科目:")
for i in info[2:]:
if i[0] == subject:
print("此学科成绩已存在!")
return
else:
grade = input("请输入学生此科目的考试成绩:")
info.append([subject,grade])
else:
subject = input("请输入学生的考试科目:")
grade = input("请输入学生此科目的考试成绩:")
info.append([subject,grade])
def modify_grade(info):
if len(info) >= 3:
subject = input("请输入要修改的学生考试科目:")
for i in info[2:]:
if i[0] == subject:
grade = input("请输入学生此科目的更改后考试成绩:")
i[1] = grade
return
else:
print("此学科的成绩不存在,无法修改!")
else:
print("此学生没有成绩,无需修改!")
def get_grade(info):
if len(info) >= 3:
subject = input("请输入要查询的学生考试科目:")
for i in info[2:]:
if i[0] == subject:
print(i[1])
return
else:
print("此学生无此科目成绩,无法查询!")
else:
print("此学生无此科目成绩,无法查询!")
def del_grade(info):
if len(info) >= 3:
subject = input("请输入要删除的学生考试科目:")
for i in info[2:]:
if i[0] == subject:
info.remove(i)
return
else:
print("此学生无此科目成绩,无法删除!")
else:
print("此学生无成绩可以删除!")
print("请初始化学生信息:")
add_info(xionghaizi_info)
while 1:
command = input("请输入你的命令:")
if command == ".":
print("bye!")
break
elif command == "add_info":
add_info(xionghaizi_info)
elif command == "add_grade":
add_grade(xionghaizi_info)
elif command == "modify_grade":
modify_grade(xionghaizi_info)
elif command == "get_grade":
get_grade(xionghaizi_info)
elif command == "del_grade":
del_grade(xionghaizi_info)
推导列表
练习:生成10–30的整数
[int(x+y) for x in ["1","2","3"] for y in map(str,range(10)) if int(x+y)<=30]
练习:把一个字典中所有的数字key进行求和,一行代码解决
算法:
1 遍历key
2 if 判断是否是数字
3 放到推导列表里面
4 sum求和
sum([k for k in {1:'a',2:"b","a":3} if isinstance(k,(int,float))])
所有的key和value为数字的全部求和,一行搞定
sum([k for k in {1:'a',2:"b","a":3} if isinstance(k,(int,float))] + [v for v
in {1:'a',2:'b',"a":3} if isinstance(v,(int,float))])
二维矩阵的转置:
a=[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
[ [j[i] for j in a] for i in range(3)]
for i in range(3):因为有3列,所以遍历3次
for j in a:遍历每一行
当i = 0时:[j[i] for j in a]表示获取每行的第1列,放到列表中
当i = 1时:[j[i] for j in a]表示获取每行的第2列,放到列表中
当i = 2时:[j[i] for j in a]表示获取每行的第3列,放到列表中
删除二维列表的某一列
a=[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
print ([[i[j] for j in [1,2]]for i in a])
for i in a:遍历列表的每一行
for j in [1,2]:遍历列表的第二列和第三列
i分别取1,2代表列表的第二列和第三列
[[i[j] for j in [1,2]]:表示每一行的第二列和第三列元素,存到子列表中