Python 列表

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

颜色和 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(集成开发环境)等其他程序和 linter/类型检查工具等静态分析工具会使用这些变量来验证函数是否使用兼容的参数调用。)

*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 -- 直到最后一个数字为止。通过结合使用 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 循环解决了遍历列表中每个元素的常见情况,但借助 when 循环,您可以完全控制索引编号。以下是一个会访问列表中的第 3 个元素的 when 循环:

  ## Access every 3rd element in a list
  i = 0
  while i < len(a):
    print(a[i])
    i = i + 3

列出方法

以下是一些其他常用的 list 方法。

  • list.append(elem) - 向列表末尾添加单个元素。常见错误:不返回新列表,只修改原始列表。
  • list.insert(index, elem) - 在给定索引处插入元素,将元素右移。
  • list.extend(list2) 会将 list2 中的元素添加到列表的末尾。对列表使用 + 或 += 与使用 extensions() 类似。
  • list.index(elem) - 从列表的开头搜索指定元素并返回其索引。如果元素未出现,则会抛出 ValueError(使用“in”检查没有 ValueError)。
  • list.remove(elem) - 搜索指定元素的第一个实例并将其删除(如果不存在,则抛出 ValueError)
  • list.sort() - 就地对列表进行排序(不返回)。(最好使用稍后显示的 Sorted() 函数。)
  • list.reverse() - 就地逆转列表(不返回)
  • list.pop(index) - 删除并返回指定索引处的元素。如果省略索引,则返回最右边的元素(大致与 end() 相反)。

请注意,这些是列表对象的 *方法*,而 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]

列表构建

一种常见的模式是以空列表 [] 的形式开始创建列表,然后使用 end() 或 extended() 向其中添加元素:

  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 中不使用排序的问题(在基本练习中)。