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 的了解越来越深入,您会看到对类型提示的引用,这些提示可让您向函数定义添加类型信息。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)
会输出字符串中的所有字符。
续航里程
range(n) 函数会生成数字 0、1、... n-1,而 range(a, b) 会返回 a、a+1、... b-1,即从 a 到 b-1 的所有数字(不包括 b)。通过将 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 循环可让您完全控制索引编号。以下 while 循环会访问列表中的每个第 3 个元素:
## 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 中的元素添加到列表末尾。对列表使用 + 或 += 与使用 extend() 类似。
- list.index(elem) - 从列表开头搜索指定元素,并返回其索引。如果该元素未显示,则会引发 ValueError(使用“in”可在没有 ValueError 的情况下进行检查)。
- list.remove(elem) - 搜索给定元素的第一个实例并将其移除(如果不存在,则会抛出 ValueError)
- list.sort() - 在原地对列表进行排序(不会返回列表)。(后面介绍的 sorted() 函数更为推荐。)
- 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]
列表构建
一种常见模式是将列表作为空列表 [] 开始,然后使用 append() 或 extend() 向其添加元素:
list = [] ## Start as the empty list list.append('a') ## Use append() to add elements list.append('b')
列出 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 中不使用排序的问题(在基本练习中)。