python中我遇到的语法问题
字典
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”)
排序
- python中排序可以用
list.sort()或者sorted(list),前者是在原数组上排序,后者是返回一个新的排序后的数组。 - 排序默认是升序排序,如果要降序排序可以用
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. 排序逻辑拆解
- 第一维度:
-x[0](按第一个元素降序)- 原始
x[0]数值:2、3、2、3、1 → 加负号后:-2、-3、-2、-3、-1 - 按负号后数值升序排列 → 对应原始数值降序:3 > 2 > 1
- 原始
- 第二维度:
x[1](按第二个元素升序)- 当
x[0]相等时(如两个3、两个2),按字符串自然顺序升序:'Anna' < 'Bob'、'Alice' < 'Charlie'
- 当
四、灵活扩展(修改排序规则)
1. 场景1:先按第1元素升序,再按第2元素降序
1 | # 数值降序用 -x[1],字符串降序用 x[1][::-1] |
2. 场景2:三维度排序(先按第1元素降序,第2升序,第3降序)
1 | # 原始列表(三元组) |
五、注意事项
- 元素结构要求:列表中的元素必须是「可通过索引取值的类型」(元组、列表),且索引对应的元素支持比较(如数值、字符串)。
- 字符串排序:字符串按 ASCII 码自然排序(大写字母 < 小写字母,如
'A' < 'a'),降序需用反转或自定义逻辑。 - 非数值类型降序:若第二维度是字符串,想实现降序,除了
x[1][::-1],也可单独对该维度处理(如结合sorted的reverse=True,但需注意多维度优先级)。
字符串
- python中字符串是不可变的,所以如果要修改字符串中的某个字符,只能先将字符串转换为列表,修改后再转换为字符串。
- 字符串的拼接可以用
+号,也可以用join()方法,比如'a'+'b'或者'a'.join(['b', 'c'])。 - 判断字符串是否只包含数字可以用
str.isdigit()方法,比如'123'.isdigit()返回True,'123a'.isdigit()返回False。
表达式
- 生成器表达式是一种简洁的创建生成器的方式,它的语法和列表推导式类似,但是用圆括号括起来,比如
(x for x in range(5))。
队列
deque(发音:deck),它是 Python 标准库 collections 中的「双端队列」,实现了在队列两端高效插入和删除元素的功能。相比于列表,deque 在头尾操作时具有更好的性能表现,时间复杂度为 O(1)。
deque 提供了 append()、appendleft()、pop()、popleft() 等方法,分别用于在队列的右端插入元素、左端插入元素、从右端删除元素、从左端删除元素。
deque 支持索引访问,比如
deque[0]表示获取队列的队头元素,deque[-1]表示获取队列的队尾元素。
无穷大和无穷小
- python中无穷大可以用
float('inf')表示,无穷小可以用float('-inf')表示。 - 可以用
math.isinf()方法判断一个数是否为无穷大,比如math.isinf(float('inf'))返回True,math.isinf(10)返回False。
面向对象的编程
- 在类的方法中,第一个参数通常是self,表示类的实例本身,可以通过self访问类的属性和方法。
- 在一个函数中用self.变量可以使这个变量成为类的属性,从而可以在类的其他方法中使用。
逆向遍历
- 逆向遍历可以用
for i in range(len(strn)-1, -1, -1):实现,比如for i in range(len('hello')-1, -1, -1):会遍历'hello'中的每个字符。 - 逆向遍历可以用在需要从后往前处理字符串或列表的场景,比如判断回文数、反转字符串等。
但是i->i+1并非向左,实际上只是先取i=len(strn)-1,再取i=len(strn)-2,以此类推。(下标仍是向右变大的)