列表拷贝&简单算法

一、列表拷贝【重点掌握】

# 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}在列表中不存在")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值