【Python】列表排序,推导式

一、列表排序

使用sort()函数,语法格式

1
listname.sort(key=None,reverse=False)
  • reverse是可选参数,默认情况进行升序排序

当reverse = True,则表示为降序排序

  • key表示从每个元素中提取用于比较的键

当对字符串排序时,可以设置key参数,默认区分大小写进行排序,当key=str.lower,此时排序不区分大小写

sorted函数

1
sorted(listname,key=None,reverse=False)

与sort函数的作用基本相同,不过sorted函数不会改变原列表,而是通过返回值的方式进行排序

二、列表推导式

列表推导式的基本结构如下,外面由方括号 [] 包裹:

1
[表达式 for 变量 in 可迭代对象 if 条件]
  • 表达式:你要放入新列表中的元素(可以是变量本身,也可以是对变量的计算或方法调用)。
  • for 变量 in 可迭代对象:负责遍历原有的数据。
  • if 条件:(可选)用于过滤数据的条件,只有满足条件的元素才会被送到前面的“表达式”中处理。

常见用法与示例对比

1. 基础用法(不带条件)

需求:生成一个包含 1 到 5 平方数的列表。

  • 传统 for 循环写法

    1
    2
    3
    squares = []
    for i in range(1, 6):
    squares.append(i**2)
  • 列表推导式写法

    1
    2
    squares = [i**2 for i in range(1, 6)]
    print(squares) # 结果: [1, 4, 9, 16, 25]

2. 加入 if 过滤条件

需求:提取 1 到 10 之间的所有偶数。

1
2
evens = [x for x in range(1, 11) if x % 2 == 0]
print(evens) # 结果: [2, 4, 6, 8, 10]

3. 带有 if-else 的条件赋值

如果你需要根据条件来决定放入什么样的值(满足条件放A,不满足放B),这时候 if-else 需要写在 for前面,作为“表达式”的一部分。 需求:遍历 1 到 5,偶数保持原样,奇数替换成字符串 “奇”。

1
2
mixed = [x if x % 2 == 0 else "奇" for x in range(1, 6)]
print(mixed) # 结果: ['奇', 2, '奇', 4, '奇']

4. 嵌套循环(多重遍历)

你可以在一个列表推导式中使用多个 for,这相当于多层嵌套循环。 需求:将颜色和尺码进行两两组合。

1
2
3
4
colors = ["红", "黑"]
sizes = ["S", "M"]
clothes = [f"{c}-{s}" for c in colors for s in sizes]
print(clothes) # 结果: ['红-S', '红-M', '黑-S', '黑-M']

5. 提取对象属性或调用方法

需求:将一个全是小写字符串的列表转换成全大写,并去除两端空格。

1
2
3
words = [" hello ", "world", " python "]
clean_words = [word.strip().upper() for word in words]
print(clean_words) # 结果: ['HELLO', 'WORLD', 'PYTHON']

1. word.strip():去除首尾空白

strip() 方法的作用是去除字符串最左边最右边的空白字符(包括空格、换行符 \n、制表符 \t 等)。

  • 注意:它不会去除字符串中间的空格。
  • 示例:如果 word = " hello "(前后都有空格),执行 word.strip() 后,结果会变成 "hello"

2. .upper():全部转为大写

upper() 方法的作用是将字符串中的所有小写英文字母转换成大写。

  • 示例:对上一步得到的 "hello" 执行 .upper(),结果就会变成 "HELLO"

连起来看:执行顺序是从左到右

当写成 word.strip().upper() 时,Python 会这样按顺序处理:

  1. 先拿到 word 本身的值(例如 " python ")。
  2. 执行 .strip(),把前后的空格“剥”掉,生成一个新的字符串 "python"
  3. 紧接着对这个新鲜出炉的 "python" 执行 .upper(),把它变成大写,最终得到 "PYTHON"

分步写的代码 vs 链式调用:

如果不使用链式调用,代码需要写成两行:

1
2
3
word = " python "
step1 = word.strip() # 此时 step1 是 "python"
result = step1.upper() # 此时 result 是 "PYTHON"

而使用链式调用,一行就能搞定,非常简洁:

1
2
word = " python "
result = word.strip().upper() # 一步到位得到 "PYTHON"