Python 有一个非常棒的内置列表类型,名为“list”。列表字面量用方括号 [ ] 编写。列表的工作方式与字符串类似:使用 len() 函数和方括号 [ ] 访问数据,第一个元素位于索引 0 处。(请参阅官方的 python.org 列表文档。)
colors = ['red', 'blue', 'green'] print(colors[0]) ## red print(colors[2]) ## green print(len(colors)) ## 3
列表上带有 = 的分配不会创建副本。相反,赋值会使两个变量指向内存中的一个列表。
b = colors ## Does not copy the list
“空列表”只是一对空的方括号 [ ]。前缀中的“+”用于附加两个列表,因此 [1, 2] + [3, 4] 会生成 [1, 2, 3, 4](这就像带字符串的 + 一样)。
FOR 和 IN
Python 的 *for* 和 *in* 结构非常有用,我们首先会看到它们是与列表配合使用。*for* 结构 (for var in list
) - 用于轻松查看列表(或其他集合)中的每个元素。请勿在迭代期间向列表添加或从中移除。
squares = [1, 4, 9, 16] sum = 0 for num in squares: sum += num print(sum) ## 30
如果您知道列表中的内容类型,请在循环中使用变量名称来捕获该信息,例如“num”、“name”或“url”。由于 Python 代码没有其他语法来提醒您注意类型,因此变量名称是您了解代码情况的关键方式。 (这有点误导性。随着您越来越多地接触 Python,您会看到对 type 提示,可让您添加输入 向函数定义中添加信息Python 在运行时不使用这些类型提示 您的计划。IDE(集成开发环境)和 静态分析工具(如 linters/类型检查工具),用于验证函数是否被调用 使用兼容参数)。
*in* 结构本身是一种简单的测试方法,用于测试某个元素是否出现在列表(或其他集合)中 -- value in collection
- 用于测试该值是否在集合中,并返回 True/False。
list = ['larry', 'curly', 'moe'] if 'curly' in list: print('yay') ## yay
for/in 结构在 Python 代码中十分常见,适用于列表以外的数据类型,因此您只需记住其语法即可。您可能有其他语言的习惯,开始手动迭代集合,而在 Python 中,您应该仅使用 for/in。
您还可以使用 for/in 处理字符串。字符串的作用相当于字符列表,因此 for ch in s: print(ch)
会输出字符串中的所有字符。
续航里程
范围(n) 函数生成数字 0、1、... n-1,而范围(a, b) 返回 a、a+1、... b-1,直到但不包括最后一个数字。您可以结合使用 for 循环和 range() 函数来构建传统的数字 for 循环:
## print the numbers from 0 through 99 for i in range(100): print(i)
有一个变体 xrange(),可避免在对性能敏感的情况下构建整个列表(在 Python 3 中,range() 将具有良好的性能行为,您可以忽略 xrange())。
While 循环
Python 还具有标准的 while 循环,并且 *break* 和 *continue* 语句与在 C++ 和 Java 中一样工作,改变了最内层循环的过程。上面的 for/in 循环解决了迭代列表中每个元素的常见情况,但是,while 循环可让您完全控制索引编号。以下是访问列表中的每个第三个元素的 when 循环:
## Access every 3rd element in a list i = 0 while i < len(a): print(a[i]) i = i + 3
列出方法
以下是一些其他常用的列表方法。
- list.append(elem) - 将单个元素添加到列表末尾。常见错误:不返回新列表,只修改了原始列表。
- list.insert(index, elem) - 在给定索引处插入元素,将元素向右移。
- list.extend(list2) 将 list2 中的元素添加到列表末尾。对列表使用 + 或 += 与使用 extension() 类似。
- list.index(elem) - 从列表的开头搜索指定元素并返回其索引。如果该元素未显示,则会引发 ValueError(使用“in”可在没有 ValueError 的情况下进行检查)。
- list.remove(elem) - 搜索指定元素的第一个实例并将其删除(如果不存在,则抛出 ValueError)
- list.sort() -- 对列表就地排序(不返回)。(最好使用稍后显示的 order() 函数。)
- list.reverse() - 就地反转列表(不返回列表)
- list.pop(index) - 删除并返回指定索引处的元素。如果省略索引,则返回最右边的元素(大致与 append()相反)。
请注意,这些是针对列表对象的 *方法*,而 len() 是将列表(或字符串或其他内容)作为参数的函数。
list = ['larry', 'curly', 'moe'] list.append('shemp') ## append elem at end list.insert(0, 'xxx') ## insert elem at index 0 list.extend(['yyy', 'zzz']) ## add list of elems at end print(list) ## ['xxx', 'larry', 'curly', 'moe', 'shemp', 'yyy', 'zzz'] print(list.index('curly')) ## 2 list.remove('curly') ## search and remove that element list.pop(1) ## removes and returns 'larry' print(list) ## ['xxx', 'moe', 'shemp', 'yyy', 'zzz']
常见错误:请注意,上述方法不会 *返回* 修改后的列表,而只是修改原始列表。
list = [1, 2, 3] print(list.append(4)) ## NO, does not work, append() returns None ## Correct pattern: list.append(4) print(list) ## [1, 2, 3, 4]
名单积累
一种常见的模式是将列表作为空列表 [] 开头,然后使用附加() 或 extension() 向其中添加元素:
list = [] ## Start as the empty list list.append('a') ## Use append() to add elements list.append('b')
列出 Slice
Slice 可以处理列表,就像处理字符串一样,还可用于更改列表的子部分。
list = ['a', 'b', 'c', 'd'] print(list[1:-1]) ## ['b', 'c'] list[0:2] = 'z' ## replace ['a', 'b'] with ['z'] print(list) ## ['z', 'c', 'd']
练习:list1.py
要练习本部分中的资料,请尝试 list1.py 中不使用排序的问题(在基本练习中)。