6.1 KiB
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()是字符串与字符串列表之间转换的核心工具。- 虽然列表能包含任意对象和嵌套结构,但实际编程中应优先保持简单、一致的数据结构。