算法题Python常用内置函数、方法、技巧汇总(其一:列表)

2023-12-23 21:32:01

列表相关操作

排序

列表的方法sort()或者内置函数sorted()可以完成排序操作。

# 对lst本身进行升序排列,使用sort()方法
lst = [3, 1, 2]
lst.sort()        

# 得到一个新的升序列表,lst保持不变,使用sorted()内置函数
lst = [3, 1, 2]
lst_sorted = list(sorted(lst))

注意:无论是方法sort()或者内置函数sorted()都有两个形参,reversekey前者表示是否倒序排列后者表示排序的依据,通常会涉及到lambda匿名函数的使用。关于key形参以及lambda匿名函数的使用可以详见真题【排序】2023Q1A-身高提供排序 中的进阶部分。

# 对lst本身进行降序排列,使用sort()方法
lst = [3, 1, 2]
lst.sort(reverse = True)        

# 得到一个新的降序列表,lst保持不变,使用sorted()内置函数
lst = [3, 1, 2]
lst_sorted = list(sorted(lst, reverse = True))

翻转

列表的方法reverse()或者内置函数reversed()可以完成翻转操作。

# 对lst本身进行翻转,使用reverse()方法
lst = [3, 1, 2]
lst.reverse()        

# 得到一个新的翻转列表,lst保持不变,使用reversed()内置函数
lst = [3, 1, 2]
lst_reversed = list(reversed(lst))

也可以使用列表的切片操作来完成翻转,设置步长为-1即可。

# 得到一个新的翻转列表,lst保持不变,使用切片操作
lst = [3, 1, 2]
lst_reversed = lst[::-1]

枚举

如果想在for循环中同时获得列表的索引i和元素值v,可以使用枚举内置函数enumerate(lst),其语法如下:

lst = ["a", "b", "c"]
for i, v in enumerate(lst):
    print(i, v)

# 依次输出
# 0 a
# 1 b
# 2 c

这种写法等价于:

lst = ["a", "b", "c"]
for i in range(len(lst)):
    v = lst[i]
    print(i, v)

另外,enumerate(lst, start)支持传入第二个参数start,表示索引i的从start开始计数。譬如

lst = ["a", "b", "c"]
for i, v in enumerate(lst, 1):
    print(i, v)

# 由于i会从1而不是从0开始,
# 依次输出
# 1 a
# 2 b
# 3 c

上述用法经常在固定滑窗题目中,搭配列表的切片来使用。譬如

k = 2        # 一个固定长度为2的滑窗
lst = ["a", "b", "c", "d", "e"]
for i, v in enumerate(lst[k:], k):
    print(i, v)

# 由于i会从2而不是从0开始,
# 依次输出
# 2 c
# 3 d
# 4 3

合并

有两个长度相等的列表a_lstb_lst,如果想获得由同一索引对应元素构成的二元元组列表,可以使用内置函数zip()

a_lst = [0, 1, 2]
b_lst = ["a", "b", "c"]
# 得到二维列表[(0, 'a'), (1, 'b'), (2, 'c')]
merge_lst = list(zip(a_lst, b_lst))

更常见的使用场景是在for循环中:

a_lst = [0, 1, 2]
b_lst = ["a", "b", "c"]
for a, b in zip(a_lst, b_lst):
    print(a, b)

去重

直接使用哈希集合set()的特性,即可完成列表的去重。

lst = [1, 1, 2, 3, 3]
lst_nonrepeat = list(set(lst))

拷贝

先思考执行以下代码,为什么列表a会随着列表b的变化而变化?

a = [1,2,3]
b = a
b[0] = 0

print(b)
# 得到[0,2,3]
print(a)
# 得到[0,2,3]

这实际上涉及到python一切皆对象的设计思想,此处的ab是同一个列表对象的两个别名,它们表示同一个列表,因此修改b会牵连到a。这也是初学者非常容易犯的一个错误。

为了使得ab指向两个不同的列表对象,我们在赋值操作时可以有两种操作,来让b获得a的拷贝:

  1. 使用切片。即令b = a[:]
a = [1,2,3]
b = a[:]
b[0] = 0

print(b)
# 得到[0,2,3]
print(a)
# 得到[1,2,3]
  1. 使用copy()方法。即令b = a.copy()
a = [1,2,3]
b = a.copy()
b[0] = 0

print(b)
# 得到[0,2,3]
print(a)
# 得到[1,2,3]

以上两种方法,都可以使得ab表示两个不同的(但值相同的)列表对象。这个技巧在回溯算法中非常常见


华为OD算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多

文章来源:https://blog.csdn.net/weixin_48157259/article/details/135174117
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。