返回介绍

3.2. List 介绍

发布于 2019-09-14 13:30:28 字数 18201 浏览 906 评论 0 收藏 0

3.2. List 介绍

  • 3.2.1. List 的定义
  • 3.2.2. 向 list 中增加元素
  • 3.2.3. 在 list 中搜索
  • 3.2.4. 从 list 中删除元素
  • 3.2.5. 使用 list 的运算符

List 是 Python 中使用最频繁的数据类型。 如果您对 list 仅有的经验就是在 Visual Basic 中的数组或 Powerbuilder 中的数据存储, 那么就打起精神学习 Python 的 list 吧。

注意
Python 的 list 如同 Perl 中的数组。在 Perl 中, 用来保存数组的变量总是以 @ 字符开始;在 Python 中, 变量可以任意取名, 并且 Python 在内部会记录下其数据类型。
注意
Python 中的 list 更象 Java 中的数组 (您可以简单的这样理解, 但 Python 中的 list 远比 Java 中的数组强大)。一个更好的类比是 ArrayList 类, 它可以保存任意对象, 并且可以在增加新元素时动态扩展。

3.2.1. List 的定义

例 3.6. 定义 List

>>> li = ["a", "b", "mpilgrim", "z", "example"] 1
>>> li
['a', 'b', 'mpilgrim', 'z', 'example']
>>> li[0]                                       2
'a'
>>> li[4]                                       3
'example'
1首先我们定义了一个有 5 个元素的 list。注意它们保持着初始的顺序。这不是偶然。List 是一个用方括号包括起来的有序元素的集合。
2List 可以作为以 0 下标开始的数组。任何一个非空 list 的第一个元素总是 li[0]。
3这个包含 5 个元素 list 的最后一个元素是 li[4], 因为列表总是从 0 开始。

例 3.7. 负的 list 索引

>>> li
['a', 'b', 'mpilgrim', 'z', 'example']
>>> li[-1] 1
'example'
>>> li[-3] 2
'mpilgrim'
1负数索引从 list 的尾部开始向前计数来存取元素。任何一个非空的 list 最后一个元素总是 li[-1]。
2如果负数索引使您感到糊涂, 可以这样理解: li[-n] == li[len(li) - n]。 所以在这个 list 里, li[-3] == li[5 - 3] == li[2]。

例 3.8. list 的分片(slice)

>>> li
['a', 'b', 'mpilgrim', 'z', 'example']
>>> li[1:3]  1
['b', 'mpilgrim']
>>> li[1:-1] 2
['b', 'mpilgrim', 'z']
>>> li[0:3]  3
['a', 'b', 'mpilgrim']
1您可以通过指定 2 个索引得到 list 的子集, 叫做一个 “slice” 。返回值是一个新的 list, 它包含了 list 中按顺序从第一个 slice 索引 (这里为 li[1]) 开始, 直到但是不包括第二个 slice 索引 (这里为 li[3]) 的所有元素。
2如果一个或两个 slice 索引是负数, slice 也可以工作。如果对您有帮助, 您可以这样理解:从左向右阅读 list, 第一个 slice 索引指定了您想要的第一个元素, 第二个 slice 索引指定了第一个您不想要的元素。返回的值为在其间的每个元素。
3List 从 0 开始, 所以 li[0:3] 返回 list 的前 3 个元素, 从 li[0] 开始, 直到但不包括 li[3]。

例 3.9. Slice 简写

>>> li
['a', 'b', 'mpilgrim', 'z', 'example']
>>> li[:3] 1
['a', 'b', 'mpilgrim']
>>> li[3:] 2 3
['z', 'example']
>>> li[:]  4
['a', 'b', 'mpilgrim', 'z', 'example']
1如果左侧分片索引为 0, 您可以将其省略, 默认为 0。所以 li[:3] 同 例 3.8 “list 的分片(slice)” 的 li[0:3] 是一样的。
2同样的, 如果右侧分片索引是 list 的长度, 可以将其省略。所以 li[3:] 同 li[3:5] 是一样的, 因为这个 list 有 5 个元素。
3请注意这里的对称性。在这个包含 5 个元素的 list 中, li[:3] 返回前 3 个元素, 而 li[3:] 返回后 2 个元素。实际上, li[:n] 总是返回前 n 个元素, 而 li[n:] 将返回剩下的元素, 不管 list 有多长。
4如果将两个分片索引全部省略, 这将包括 list 的所有元素。但是与原始的名为 li 的 list 不同, 它是一个新 list, 恰好拥有与 li 一样的全部元素。li[:] 是生成一个 list 完全拷贝的一个简写。

3.2.2. 向 list 中增加元素

例 3.10. 向 list 中增加元素

>>> li
['a', 'b', 'mpilgrim', 'z', 'example']
>>> li.append("new")               1
>>> li
['a', 'b', 'mpilgrim', 'z', 'example', 'new']
>>> li.insert(2, "new")            2
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new']
>>> li.extend(["two", "elements"]) 3
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements']
1append 向 list 的末尾追加单个元素。
2insert 将单个元素插入到 list 中。数值参数是插入点的索引。请注意, list 中的元素不必唯一, 现在有两个独立的元素具有 'new' 这个值, li[2] 和 li[6]。
3extend 用来连接 list。请注意不要使用多个参数来调用 extend, 要使用一个 list 参数进行调用。在本例中, 这个 list 有两个元素。

例 3.11. extend (扩展) 与 append (追加)的差别

>>> li = ['a', 'b', 'c']
>>> li.extend(['d', 'e', 'f']) 1
>>> li
['a', 'b', 'c', 'd', 'e', 'f']
>>> len(li)                    2
6
>>> li[-1]
'f'
>>> li = ['a', 'b', 'c']
>>> li.append(['d', 'e', 'f']) 3
>>> li
['a', 'b', 'c', ['d', 'e', 'f']]
>>> len(li)                    4
4
>>> li[-1]
['d', 'e', 'f']
1Lists 的两个方法 extend 和 append 看起来类似, 但实际上完全不同。 extend 接受一个参数, 这个参数总是一个 list, 并且添加这个 list 中的每个元素到原 list 中。
2在这里 list 中有 3 个元素 ('a', 'b' 和 'c'), 并且使用另一个有 3 个元素 ('d', 'e' 和 'f') 的 list 扩展之, 因此新的 list 中有 6 个元素。
3另一方面, append 接受一个参数, 这个参数可以是任何数据类型, 并且简单地追加到 list 的尾部。 在这里使用一个含有 3 个元素的 list 参数调用 append 方法。
4原来包含 3 个元素的 list 现在包含 4 个元素。 为什么是 4 个元素呢? 因为刚刚追加的最后一个元素 本身是个 list。 List 可以包含任何类型的数据, 也包括其他的 list。 这或许是您所要的结果, 或许不是。 如果您的意图是 extend, 请不要使用 append。

3.2.3. 在 list 中搜索

例 3.12. 搜索 list

>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements']
>>> li.index("example") 1
5
>>> li.index("new")     2
2
>>> li.index("c")       3
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
ValueError: list.index(x): x not in list
>>> "c" in li           4
False
1index 在 list 中查找一个值的首次出现并返回索引值。
2index 在 list 中查找一个值的首次出现。 这里 'new' 在 list 中出现了两次, 在 li[2] 和 li[6], 但 index 只返回第一个索引, 2。
3如果在 list 中没有找到值, Python 会引发一个异常。这一点与大部分的语言截然不同, 大部分语言会返回某个无效索引。尽管这种处理可能令人讨厌, 但它仍然是件好事, 因为它说明您的程序会由于源代码的问题而崩溃, 好于在后面当您使用无效索引而引起崩溃。
4要测试一个值是否在 list 内, 使用 in, 如果值存在, 它返回 True, 否则返为 False 。
注意
在 2.2.1 版本之前, Python 没有单独的布尔数据类型。 为了弥补这一点, Python 在布尔环境 (如 if 语句) 中几乎接受所有东西, 遵循下面的规则:
  • 0 为 false; 其它所有数值皆为 true。
  • 空串 ("") 为 false; 其它所有字符串皆为 true。
  • 空 list ([]) 为 false; 其它所有 list 皆为 true。
  • 空 tuple (()) 为 false; 其它所有 tuple 皆为 true。
  • 空 dictionary ({}) 为 false; 其它所有 dictionary 皆为 true。
这些规则仍然适用于 Python 2.2.1 及其后续版本, 但现在您也可以使用真正的布尔值, 它的值或者为 True 或者为 False。 请注意第一个字母是大写的;这些值如同在 Python 中的其它东西一样都是大小写敏感的。

3.2.4. 从 list 中删除元素

例 3.13. 从 list 中删除元素

>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements']
>>> li.remove("z")   1
>>> li
['a', 'b', 'new', 'mpilgrim', 'example', 'new', 'two', 'elements']
>>> li.remove("new") 2
>>> li
['a', 'b', 'mpilgrim', 'example', 'new', 'two', 'elements']
>>> li.remove("c")   3
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
ValueError: list.remove(x): x not in list
>>> li.pop()         4
'elements'
>>> li
['a', 'b', 'mpilgrim', 'example', 'new', 'two']
1remove 从 list 中删除一个值的首次出现。
2remove 仅仅 删除一个值的首次出现。 在这里, 'new' 在 list 中出现了两次, 但 li.remove("new") 只删除了 'new' 的首次出现。
3如果在 list 中没有找到值, Python 会引发一个异常来响应 index 方法。
4pop 是一个有趣的东西。它会做两件事: 删除 list 的最后一个元素, 然后返回删除元素的值。请注意, 这与 li[-1] 不同, 后者返回一个值但不改变 list 本身。也不同于 li.remove(value), 后者改变 list 但并不返回值。

3.2.5. 使用 list 的运算符

例 3.14. List 运算符

>>> li = ['a', 'b', 'mpilgrim']
>>> li = li + ['example', 'new'] 1
>>> li
['a', 'b', 'mpilgrim', 'example', 'new']
>>> li += ['two']                2
>>> li
['a', 'b', 'mpilgrim', 'example', 'new', 'two']
>>> li = [1, 2] * 3              3
>>> li
[1, 2, 1, 2, 1, 2]
1Lists 也可以用 + 运算符连接起来。 list = list + otherlist 相当于 list.extend(otherlist)。 但 + 运算符把一个新 (连接后) 的 list 作为值返回, 而 extend 只修改存在的 list。 也就是说, 对于大型 list 来说, extend 的执行速度要快一些。
2Python 支持 += 运算符。 li += ['two'] 等同于 li.extend(['two'])。 += 运算符可用于 list, 字符串和整数, 并且它也可以被重载用于用户自定义的类中 (更多关于类的内容参见 第 5 章)。
3* 运算符可以作为一个重复器作用于 list。 li = [1, 2] * 3 等同于 li = [1, 2] + [1, 2] + [1, 2], 即将三个 list 连接成一个。

进一步阅读

  • How to Think Like a Computer Scientist 讲述了list, 并且重点讲述了如何 把 list 作为函数参数传递。
  • Python Tutorial 展示了如何 把 list 作为堆栈和队列使用。
  • Python Knowledge Base 回答了 有关 list 的常见问题 并且有许多 使用 list 的示例代码。
  • Python Library Reference 总结了 所有的 list 方法。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文