一、列表拷贝【重点掌握】
# 1.=引用赋值 # a.一维列表 list1 = [11,22,33] list2 = list1 print(list1 is list2) # True print(id(list1)) print(id(list2)) list1[1] = 100 print(list1) # [11, 100, 33] print(list2) # [11, 100, 33] print(list1 is list2) # True print("*" * 30) # b.二维列表 list1 = [[11,22,33],[44,55]] list2 = list1 print(list1 is list2) print(id(list1)) print(id(list2)) list1[0][1] = 100 print(list1) print(list2) print(list1 is list2) # 结论:如果通过=的方式进行列表的引用赋值,如果其中一个列表中的元素修改,则另一个列表中的元素也会随着修改 print("*" * 30) # 2.列表.copy(),也可以当做浅拷贝 # a.一维列表 list1 = [11,22,33] list2 = list1.copy() print(list1 is list2) print(id(list1)) print(id(list2)) list1[1] = 100 print(list1) print(list2) print(list1 is list2) # False print(list1[0] is list2[0]) # True print("*" * 30) # b.二维列表 list1 = [[11,22,33],[44,55]] list2 = list1.copy() print(list1 is list2) print(id(list1)) print(id(list2)) list1[0][1] = 100 print(list1) print(list2) print(list1 is list2) # list1 = [[11,22,33],[44,55]] # list2 = list1.copy() # print(list1 is list2) # list1[0] = [100] # print(list1) # print(list2) # print(list1 is list2) """ 列表.copy()结论: 一维列表:一个列表中的元素修改,对另一个列表没有任何影响 二维列表:一个列表中最里层的元素修改,另一个列表会随着修改 """ print("*" * 30) # 【面试题】说明浅拷贝和深拷贝的区别 import copy # 3.copy.copy():浅拷贝 # a.一维列表 list1 = [11,22,33] list2 = copy.copy(list1) print(list1 is list2) print(id(list1)) print(id(list2)) list1[1] = 100 print(list1) print(list2) print(list1 is list2) print("*" * 30) # b.二维列表 list1 = [[11,22,33],[44,55]] list2 = copy.copy(list1) print(list1 is list2) print(id(list1)) print(id(list2)) list1[0][1] = 100 print(list1) print(list2) print(list1 is list2) """ copy.copy()结论: 一维列表:一个列表中的元素修改,对另一个列表没有任何影响 二维列表:一个列表中最里层的元素修改,另一个列表会随着修改 """ # 4.copy.deepcopy():深拷贝 # a.一维列表 list1 = [11,22,33] list2 = copy.deepcopy(list1) print(list1 is list2) print(id(list1)) print(id(list2)) list1[1] = 100 print(list1) print(list2) print(list1 is list2) print("*" * 30) # b.二维列表 list1 = [[11,22,33],[44,55]] list2 = copy.deepcopy(list1) print(list1 is list2) print(id(list1)) print(id(list2)) list1[0][1] = 100 print(list1) print(list2) print(list1 is list2) # copy.deepcopy()结论:只要修改其中一个列表中的元素,对另一个列表都没有影响 # 注意:浅拷贝只会拷贝最外层的地址,深拷贝会拷贝所有的地址 # 【面试题】代码阅读题 a = [1,2,3] b = [4,5] c = [a,b] # c[0]--->a的地址 c[1]--->b的地址 d = c e = c.copy() f = copy.deepcopy(c) a.append(10) print(c) # [[1,2,3,10],[4,5]] print(d) # [[1,2,3,10],[4,5]] print(e) # [[1,2,3,10],[4,5]] print(f) # [[1,2,3],[4,5]] # =:一个改,另一个随着改 # 列表.copy()和copy.copy():分一维和二维讨论 # copy.deepcopy():一个改,另一个不改
二、简单算法【重点掌握】
1.1冒泡排序
排序思路:比较两个相邻的下标对应的元素,如果符合条件就交换位置(最值出现在最后位)
# 【面试题】冒泡排序 # 以升序为例 list1 = [34,45,6,74,45,5,6,7,10,67] # 外层循环:控制的是比较的次数 for i in range(len(list1) - 1): # 内层循环:控制的是每一轮比较的次数,同时兼顾参与比较的下标 for j in range(len(list1) - 1 - i): # 比较:只要符合条件则交换位置 # 如果下标小的元素 > 下标大的元素 ,则交换位置 # 参与比较的下标,j 和j + 1 if list1[j] > list1[j + 1]: list1[j],list1[j + 1] = list1[j + 1],list1[j] print(list1) # 降序为例 list1 = [34,45,6,74,45,5,6,7,10,67] # 外层循环:控制的是比较的次数 for i in range(len(list1) - 1): # 内层循环:控制的是每一轮比较的次数,同时兼顾参与比较的下标 for j in range(len(list1) - 1 - i): # 比较:只要符合条件则交换位置 # 如果下标小的元素 < 下标大的元素 ,则交换位置 # 参与比较的下标,j 和j + 1 if list1[j] < list1[j + 1]: list1[j],list1[j + 1] = list1[j + 1],list1[j] print(list1)
1.2选择排序
排序思路:固定一个下标,然后拿这个下标对应的值依次和后面的元素进行比较,最值出现在头角标位置上
# 【面试题】选择排序 # 以升序为例 list1 = [34,45,6,74,45,5,6,7,10,67] # 外层循环:控制的是比较的轮数 for i in range(len(list1) - 1): # 内层循环:控制的是每一轮比较的次数,兼顾参与比较的下标 for j in range(i + 1,len(list1)): # 比较:只要符合条件则交换位置 # 如果下标小的元素 > 下标大的元素 ,则交换位置 # 参与比较的下标,i 和 j if list1[i] > list1[j]: list1[i],list1[j] = list1[j],list1[i] print(list1) # 以降序为例 list1 = [34,45,6,74,45,5,6,7,10,67] # 外层循环:控制的是比较的轮数 for i in range(len(list1) - 1): # 内层循环:控制的是每一轮比较的次数,兼顾参与比较的下标 for j in range(i + 1,len(list1)): # 比较:只要符合条件则交换位置 # 如果下标小的元素 < 下标大的元素 ,则交换位置 # 参与比较的下标,i 和 j if list1[i] < list1[j]: list1[i],list1[j] = list1[j],list1[i] print(list1) # 自学:快速排序,插入排序
1.3顺序查找
# 查找思路:将待查找元素和指定列表中的元素进行依次的比对,如果相等,则获取对应的索引即可 # 1. list1 = [34,45,6,74,45,5,6,7,10,67] key = 45 for i in range(len(list1)): if list1[i] == key: print(i) print("*" * 30) # 2.index():获取元素在列表中第一次出现的下标 list1 = [34,45,6,74,45,5,6,7,10,67] key = 100 for i in range(len(list1)): if list1[i] == key: print(i) break else: print(f"{key}在列表中不存在")
1.4二分法查找
查找思路:如果列表是升序的前提下,将待查找的元素与中间下标对应的元素比较,如果大于中间下标对应的元素,则去右半部分查找
注意:前提是列表是有序(升序或者降序)的,通过折半来缩小查找范围,提高查找效率
# 【面试题】二分法查找 # 以升序为例 list1 = [34,45,6,74,45,5,6,7,10,67] list1.sort() # 待查找元素 key = 100 # 定义变量,分别表示索引的最大值和最小值 left = 0 right = len(list1) - 1 # left在逐渐增大,right在逐渐减小,在改变的过程中,知道left==right,还未找到指定元素,则说明该元素不存在 while left <= right: # 计算中间下标 middle = (left + right) // 2 # 比较 if key > list1[middle]: # 重置left的值 left = middle + 1 elif key < list1[middle]: # 重置right的值 right = middle - 1 else: print(f"待查找元素{key}在列表中的索引为:{middle}") # 如果查找到,则可以提前结束循环,注意:只能获取一个索引 break else: print(f"{key}在列表中不存在") # 以降序为例 list1 = [34,45,6,74,45,5,6,7,10,67] list1.sort(reverse=True) # 待查找元素 key = 100 # 定义变量,分别表示索引的最大值和最小值 left = 0 right = len(list1) - 1 # left在逐渐增大,right在逐渐减小,在改变的过程中,知道left==right,还未找到指定元素,则说明该元素不存在 while left <= right: # 计算中间下标 middle = (left + right) // 2 # 比较 if key < list1[middle]: # 重置left的值 left = middle + 1 elif key > list1[middle]: # 重置right的值 right = middle - 1 else: print(f"待查找元素{key}在列表中的索引为:{middle}") # 如果查找到,则可以提前结束循环,注意:只能获取一个索引 break else: print(f"{key}在列表中不存在")