字典

1.python中查询key是否存在直接用key in dict,并且时间复杂度为O(1)因为字典底层是哈希表实现的。
2.字典的get方法可以设置默认值,比如dict.get(key, default_value),如果key不存在则返回default_value。
3.分别使用dict.keys()dict.values()dict.items()可以获取字典的所有key、value、key-value对。注意,这三个都是方法,括号别忘了写。

数组

1.空数组的创建可以用[]或者list(),比如a = []或者a = list()。如果设置初值可以用a = [0]*n或者a = list([0]*n)
2. 数组的切片可以用array[start:end:step],比如a[1:3]表示获取数组a中索引从1到2的元素(不包括3),a[::-1]表示将数组a反转。
3. Python 中切片赋值时,右侧的赋值对象必须是可迭代对象,字符串 “number” 会被自动拆解为单个字符的可迭代序列,再逐个赋值到切片对应的位置(res[new_index-5:new_index+1] = “number”)

排序

  1. python中排序可以用list.sort()或者sorted(list),前者是在原数组上排序,后者是返回一个新的排序后的数组。
  2. 排序默认是升序排序,如果要降序排序可以用list.sort(reverse=True)或者sorted(list, reverse=True)

Python 列表自定义排序笔记(按多维度排序)

一、核心功能

对包含二元组(或长度≥2的列表)的列表,实现「多维度自定义排序」,典型场景:先按第一个元素降序,再按第二个元素升序(可灵活扩展规则)。

二、关键技术点

1. 排序函数选择

函数 特点 用法示例
list.sort() 原地排序(修改原列表) people.sort(key=lambda x: (...))
sorted() 非原地排序(返回新列表) new_people = sorted(people, key=...)

注:两者的 key 参数用法完全一致,仅是否修改原列表的区别。

2. 排序依据:key=lambda x: (维度1, 维度2, ...)

  • lambda x:匿名函数,x 代表列表中的单个元素(此处为二元组/列表,如 (3, 'a'))。
  • 返回元组 (维度1, 维度2):排序时优先按「维度1」比较,维度1相等时再按「维度2」比较,依次类推。
维度排序规则控制
需求 实现方式 示例(针对 x[0]
升序(默认) 直接使用元素本身 x[0]
降序 对数值类型加负号 -x[n] -x[0]
字符串降序 x[n][::-1] 反转字符串(或结合 reverse 参数) x[1][::-1]

三、典型案例(先按第1元素降序,再按第2元素升序)

1. 代码实现

1
2
3
4
5
6
7
8
9
10
11
# 原始列表(元素为二元组/列表均可)
people = [(2, 'Alice'), (3, 'Bob'), (2, 'Charlie'), (3, 'Anna'), (1, 'David')]

# 原地排序(修改原列表)
people.sort(key=lambda x: (-x[0], x[1]))

# 非原地排序(返回新列表,不修改原列表)
# sorted_people = sorted(people, key=lambda x: (-x[0], x[1]))

print(people)
# 输出:[(3, 'Anna'), (3, 'Bob'), (2, 'Alice'), (2, 'Charlie'), (1, 'David')]

2. 排序逻辑拆解

  1. 第一维度:-x[0](按第一个元素降序)
    • 原始 x[0] 数值:2、3、2、3、1 → 加负号后:-2、-3、-2、-3、-1
    • 按负号后数值升序排列 → 对应原始数值降序:3 > 2 > 1
  2. 第二维度:x[1](按第二个元素升序)
    • x[0] 相等时(如两个 3、两个 2),按字符串自然顺序升序:'Anna' < 'Bob''Alice' < 'Charlie'

四、灵活扩展(修改排序规则)

1. 场景1:先按第1元素升序,再按第2元素降序

1
2
3
# 数值降序用 -x[1],字符串降序用 x[1][::-1]
people.sort(key=lambda x: (x[0], x[1][::-1]))
# 示例输出:[(1, 'David'), (2, 'Charlie'), (2, 'Alice'), (3, 'Bob'), (3, 'Anna')]

2. 场景2:三维度排序(先按第1元素降序,第2升序,第3降序)

1
2
3
4
5
# 原始列表(三元组)
data = [(5, 'a', 10), (3, 'b', 20), (5, 'a', 15), (3, 'a', 5)]
data.sort(key=lambda x: (-x[0], x[1], -x[2]))
print(data)
# 输出:[(5, 'a', 15), (5, 'a', 10), (3, 'a', 5), (3, 'b', 20)]

五、注意事项

  1. 元素结构要求:列表中的元素必须是「可通过索引取值的类型」(元组、列表),且索引对应的元素支持比较(如数值、字符串)。
  2. 字符串排序:字符串按 ASCII 码自然排序(大写字母 < 小写字母,如 'A' < 'a'),降序需用反转或自定义逻辑。
  3. 非数值类型降序:若第二维度是字符串,想实现降序,除了 x[1][::-1],也可单独对该维度处理(如结合 sortedreverse=True,但需注意多维度优先级)。

字符串

  1. python中字符串是不可变的,所以如果要修改字符串中的某个字符,只能先将字符串转换为列表,修改后再转换为字符串。
  2. 字符串的拼接可以用+号,也可以用join()方法,比如'a'+'b'或者'a'.join(['b', 'c'])
  3. 判断字符串是否只包含数字可以用str.isdigit()方法,比如'123'.isdigit()返回True,'123a'.isdigit()返回False。

表达式

  1. 生成器表达式是一种简洁的创建生成器的方式,它的语法和列表推导式类似,但是用圆括号括起来,比如(x for x in range(5))

队列

  1. deque(发音:deck),它是 Python 标准库 collections 中的「双端队列」,实现了在队列两端高效插入和删除元素的功能。相比于列表,deque 在头尾操作时具有更好的性能表现,时间复杂度为 O(1)。

  2. deque 提供了 append()、appendleft()、pop()、popleft() 等方法,分别用于在队列的右端插入元素、左端插入元素、从右端删除元素、从左端删除元素。

  3. deque 支持索引访问,比如deque[0]表示获取队列的队头元素,deque[-1]表示获取队列的队尾元素。

无穷大和无穷小

  1. python中无穷大可以用float('inf')表示,无穷小可以用float('-inf')表示。
  2. 可以用math.isinf()方法判断一个数是否为无穷大,比如math.isinf(float('inf'))返回True,math.isinf(10)返回False。

面向对象的编程

  1. 在类的方法中,第一个参数通常是self,表示类的实例本身,可以通过self访问类的属性和方法。
  2. 在一个函数中用self.变量可以使这个变量成为类的属性,从而可以在类的其他方法中使用。

逆向遍历

  1. 逆向遍历可以用for i in range(len(strn)-1, -1, -1):实现,比如for i in range(len('hello')-1, -1, -1):会遍历'hello'中的每个字符。
  2. 逆向遍历可以用在需要从后往前处理字符串或列表的场景,比如判断回文数、反转字符串等。
    但是i->i+1并非向左,实际上只是先取i=len(strn)-1,再取i=len(strn)-2,以此类推。(下标仍是向右变大的)