学径 LearnPath

CAICP-E · Python 编程基础 / Wiki

列表

用方括号装一排东西,可以按位置取出其中一个。

它是什么

列表 是一排小格子。 可以按顺序装多个值。

一个 变量 通常记住一件东西。 列表让一个名字记住一排东西:全班分数、一组颜色、一星期的天气。

python
scores = [90, 85, 92]
print(scores[0])  # 90

下标从 0 开始。 [1] 是第二个。 [-1] 是最后一个。

空列表写成 []。 里面一个格子都没有。

名字从哪来

列表的英文是 list,日常意思就是「清单」。 购物清单、名单、待办事项,都是 list。

编程里还有一个近亲叫数组 array。 数组常常要求格子里装同一类型,长度有时固定。 Python 的 list 更灵活:长度可以变,格子里也可以混装不同类型。 初学建议还是装同一类东西,更好想。

方括号 [] 是列表的外形。 下标从 0 开始,这个习惯来自 C 语言家族。 第一个位置离起点的距离是 0。

它怎么工作

超出范围会 IndexError。 空列表还去取 [0],也会失败。 见 调试

添加和删除

  • append(x) 加到末尾
  • insert(i, x) 插到位置 i
  • pop() 拿走最后一个
  • pop(i) 按位置拿走
  • remove(x) 按值删掉第一次出现的 x
python
scores.append(88)
scores.pop()

删除后,后面的下标会前移。

可以用下标改某一个:

python
scores[1] = 88

遍历、排序、切片

遍历用 for

python
for s in scores:
    print(s)

也可以按下标走:

python
for i in range(len(scores)):
    print(i, scores[i])

sort() 会改原来的列表。 sorted() 给出新列表,原来的常保持不动。 它们也和 内置函数 有关。

切片取出一段。 左闭右开。

python
letters = ["a", "b", "c", "d"]
print(letters[1:3])  # ['b', 'c']

[:2] 前两个。 [2:] 从下标 2 到末尾。 len(列表) 是元素个数。

in 可以问某样东西在不在清单里:

python
print(85 in scores)

这和 查找 的想法连在一起。 in 通常从左到右问,很像顺序查找。

列表里还可以再放列表,变成表格。 那是 嵌套

生活里在哪里

  • 值日表:一排名字。
  • 购物清单:可以在末尾追加,也可以划掉已经买的。
  • 课表的一列:第 0 节、第 1 节……(如果从 0 数)。
  • 相册:按顺序一页页翻。
  • 火车车厢:第几节在第几个位置。

图书馆的书架更像「已经排好序的列表」。 那样才能用更快的查找法。

和相近概念的差别

字符串 也是一串,也能下标、切片、算长度。 字符串里的字通常不能直接改。 列表可以改某一个格子。

a[1] 是一个元素。 a[1:2] 是只含那一个元素的小列表。 类型不同,后面能做的事也不同。

以后还会见到别的装东西的办法。 初学先把列表用熟就够。

range 不是列表,但可以变成列表:list(range(3)) 得到 [0, 1, 2]

常见误会

误会 1:从 1 开始数下标。

第一个是 [0]。 长度为 3 时,最后一个下标是 2。

误会 2:以为 sorted(a) 一定改掉 a。

sorted 通常给出新列表。 a.sort() 才改原来的。

误会 3:空列表还去取 [0]

没有格子,不能取。

误会 4:remove 按位置删。

remove 按值删。 按位置请用 pop(i)

误会 5:切片越界一定报错。

切片比较宽容,超出时常常得到较短的一段,甚至空列表。 单个下标越界才会 IndexError

想知道更多

  • 书:潘洪波《小学生 Python 趣味编程》(用成绩、名单这类生活清单练列表)。
  • 书:埃里克·马瑟斯《Python 编程:从入门到实践》(列表是入门后最重要的一章之一,可和家长一起做清单小项目)。

未登录时不会保存学习进度