Files
coding-mentor-agent/kb/python-course-kb-practical-python/wiki/summaries/05_Lists.md
T

6.1 KiB
Raw Blame History

doc_type, full_text
doc_type full_text
short sources/05_Lists.md

05_Lists 摘要

本文介绍 Python列表:Python 中用于保存有序值集合的主要数据类型。列表支持创建、索引、修改、遍历、查找、删除、排序,以及与字符串之间的拆分和连接。

核心概念

创建列表

列表使用方括号字面量创建:

names = ['Elwood', 'Jake', 'Curtis']
nums = [39, 38, 42, 65, 111]

字符串也可以通过 split() 拆分为列表:

line = 'GOOG,100,490.10'
row = line.split(',')
# ['GOOG', '100', '490.10']

这体现了 Python字符串 与列表之间的常见转换关系。

列表基本操作

添加与拼接

  • append(x):在末尾添加元素。
  • insert(i, x):在指定位置插入元素。
  • +:拼接两个列表,产生新列表。
  • *:重复列表内容。
names.append('Murphy')
names.insert(2, 'Aretha')

[1, 2, 3] + ['a', 'b']
# [1, 2, 3, 'a', 'b']

[1, 2, 3] * 3
# [1, 2, 3, 1, 2, 3, 1, 2, 3]

索引、负索引与修改

列表是有序序列,使用整数索引访问,索引从 0 开始;负索引从末尾开始计数。

names[0]   # 第一个元素
names[-1]  # 最后一个元素

列表是可变对象,可以直接修改某个位置的元素:

names[1] = 'Joliet Jake'

这与字符串等不可变序列形成对比,可归入 Python序列 的更大主题。

长度与成员测试

  • len(list):返回列表长度。
  • in:判断元素是否存在。
  • not in:判断元素是否不存在。
len(names)
'Elwood' in names
'Britney' not in names

遍历与查找

使用 for 循环遍历列表中的元素:

for name in names:
    print(name)

使用 index() 查找某个值第一次出现的位置:

names.index('Curtis')

注意:

  • 如果元素出现多次,index() 只返回第一次出现的位置。
  • 如果元素不存在,会抛出 ValueError。

删除元素

列表元素可以按值或按索引删除:

names.remove('Curtis')  # 按值删除
del names[1]            # 按索引删除

删除后列表不会留下“空洞”,后续元素会自动前移。若使用 remove() 删除重复元素,只会删除第一个匹配项。

排序

列表可使用 sort() 进行原地排序:

s = [10, 1, 7, 3]
s.sort()
# [1, 3, 7, 10]

反向排序:

s.sort(reverse=True)

sort() 会修改原列表,不创建新列表。若希望保留原列表并得到排序结果,应使用 sorted():

t = sorted(s)

列表不等于数学向量

列表的 + 和 * 并不是数学向量或矩阵运算:

[1, 2, 3] * 2
# [1, 2, 3, 1, 2, 3]

[1, 2, 3] + [10, 11, 12]
# [1, 2, 3, 10, 11, 12]

因此,Python 列表不适合作为 MATLAB、Octave、R 中那种向量或矩阵的直接替代。若需要数值计算,应使用类似 NumPy 的库,可关联到 Python数值计算。

练习要点

Exercise 1.19:提取与重新赋值

通过股票代码字符串:

symbols = 'HPQ,AAPL,IBM,MSFT,YHOO,DOA,GOOG'
symlist = symbols.split(',')

练习内容包括:

  • 使用正索引与负索引访问元素。
  • 修改指定位置的值。
  • 使用切片提取子列表。
  • 创建空列表并用 append() 添加元素。
  • 使用切片赋值替换列表的一部分。

切片赋值会根据右侧列表长度自动调整左侧列表大小:

symlist[-2:] = mysyms

Exercise 1.20:遍历列表元素

使用 for 循环逐个处理列表元素:

for s in symlist:
    print('s =', s)

Exercise 1.21:成员测试

练习使用 in 与 not in 检查股票代码是否在列表中:

'AIG' in symlist
'AA' in symlist
'CAT' not in symlist

Exercise 1.22:添加、插入与删除

练习以下方法:

  • append('RHT'):末尾追加。
  • insert(1, 'AA'):插入到第二个位置。
  • remove('MSFT'):删除指定值。
  • index('YHOO'):查找第一次出现的位置。
  • count('YHOO'):统计出现次数。

该练习强调:列表允许重复值,但 remove() 只删除第一个匹配项。

Exercise 1.23:排序

使用 sort() 对列表排序,或通过 reverse=True 反向排序:

symlist.sort()
symlist.sort(reverse=True)

重点是理解原地修改:排序会直接改变 symlist 本身。

Exercise 1.24:重新连接为字符串

使用字符串的 join() 方法将字符串列表连接为一个字符串:

','.join(symlist)
':'.join(symlist)
''.join(symlist)

这与前面的 split() 构成互逆式的常见模式:

  • split():字符串 → 列表
  • join():列表 → 字符串

相关主题:Python字符串处理。

Exercise 1.25:列表可以包含任意对象

列表可以包含不同类型对象,甚至嵌套列表:

nums = [101, 102, 103]
items = ['spam', symlist, nums]

可以通过多重索引访问嵌套结构:

items[1][1]
items[2][1]

但文档建议保持列表结构简单。通常一个列表应保存同一种类型的值,例如全是数字或全是字符串。混合不同类型、构造过度复杂的嵌套列表,会降低代码可读性并增加理解难度。

关键结论

  • 列表是 Python 中最常用的有序集合类型之一。
  • 列表可变,支持按索引修改、插入、删除和切片赋值。
  • 列表支持遍历、成员测试、查找、计数和排序。
  • sort() 是原地排序,sorted() 返回新列表。
  • 列表的 + 和 * 是拼接与重复,不是数学向量运算。
  • split() 和 join() 是字符串与字符串列表之间转换的核心工具。
  • 虽然列表能包含任意对象和嵌套结构,但实际编程中应优先保持简单、一致的数据结构。