Python 列表

Python 有一个名为“list”的强大内置列表类型。列表字面量用方括号 [ ] 编写。列表的工作方式与字符串类似,使用 len() 函数和方括号 [ ] 来访问数据,其中第一个元素位于索引 0 处。(请参阅官方的 python.org 列表文档。)

  colors = ['red', 'blue', 'green']
  print(colors[0])    ## red
  print(colors[2])    ## green
  print(len(colors))  ## 3

字符串列表“red”“blue”“green”

对列表使用 = 进行赋值不会创建副本。相反,赋值会使这两个变量指向内存中的同一列表。

  b = colors   ## Does not copy the list

colors 和 b 都指向同一列表

“空列表”只是一对空的括号 [ ]。“+”可用于附加两个列表,因此 [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 中不使用排序的问题(在基本练习中)。