1. 序列概述
数据结构是以某种方式(如通过编号)组合起来的数据元素(如数、字符乃至其他数据结构)集合。(A data structure is a specialized format for organizing and storing data.)
在Python中,最基本的数据结构为序列(sequence)。序列中的每个元素都有编号,即其位置或索引,其中第一个元素的索引为0,第二个元素的索引为1,依此类推。
基本的序列包括:列表、元组、字符串。其中,列表和元组的主要不同在于,列表是可以修改的,而元组不可以。这意味着列表适用于需要中途添加元素的情形,而元组适用于出于某种考虑需要禁止修改序列的情形。
Python支持一种数据结构的基本概念,名为容器(container)。容器基本上就是可包含其他对象的对象。两种主要的容器是序列(如列表、元组、字符串)和映射(如字典)。在序列中,每个元素都有编号,而在映射中,每个元素都有名称(也叫键)。有一种既不是序列也不是映射的容器,它就是集合(set)。
2. 序列的通用操作
索引、切片、相加、相乘和成员资格检查适用于所有的序列。另外,Python还提供了一些内置函数,可用于确定序列的长度以及找出序列中最大和最小的元素。
2.1 索引
按照元素的编号来访问各个元素,即为索引(indexing)。序列从左向右,以0作为第一个元素的编号,编号依次递增;从右向左,以-1作为最后一个元素的编号,编号依次递减。
>>> greeting = 'Hellow'
>>> greeting[0]
'H'
>>> greeting[-1]
'w'
>>> 'Hellow'[1]
'e'
>>> fourth = input('Year:')[3]
Year:2008
>>> fourth
'8'
2.2 切片
除使用索引来访问单个元素外,还可使用切片(slicing)来访问特定范围内的元素。
- 切片顾头不顾尾(例如[-3:-1],无法索引到最后一个元素);
- 如果第一个索引指定的元素位于第二个索引指定的元素后面(如:[-3:0],结果就为空序列);
- 简写的重要性,当冒号后不写任何内容时,切片直接结束于序列的末尾(例如索引最后三个元素:[-3:]);
- 步长,表示索引每次移动的方向和大小,为正时,表示向右移动,反之向左。当步长为负值时,第一个索引指定的元素可以位于第二个索引指定的元素后面,而上述[-3:0]结果为空序列的原因是该操作种默认是步长为正1,索引向右移动到达末尾,而无法到达第一个元素,返回空序列。
2.3 序列相加
可使用加法运算符拼接序列。
>>> [1, 2, 3] + [4, 5, 6]
[1, 2, 3, 4, 5, 6]
>>> 'Hellow, ' + 'World!'
'Hellow, World!'
# 虽然列表和字符串都是序列,但是一般不能拼接不同类型的序列
>>> [1, 2, 3] + 'World'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list
>>> [1, 2, 3] + list('World')
[1, 2, 3, 'W', 'o', 'r', 'l', 'd']
2.4 乘法
将序列与数x相乘时,将重复这个序列x次来创建一个新序列
>>> 'python'*5
'pythonpythonpythonpythonpython'
>>> [666] * 5
[666, 666, 666, 666, 666]
创建一个包含是个元素的空列表。
>>> sequence = [None] * 10
>>> sequence
[None, None, None, None, None, None, None, None, None, None]
2.5 成员资格
要检查特定的值是否包含在序列中,可使用运算符in。它检查是否满足指定的条件,并返回相应的值:满足时返回True,不满足时返回False。这样的运算符称为布尔运算符,而前述真值称为布尔值。
例子:从用户那里获取一个用户名和一个PIN码,并检查它们组成的列表是否包含在数据库(实际上也是一个列表)中。如果用户名-PIN码对包含在数据库中,就打印字符串'Accessgranted'
>>> database = [
... ['albert', '1234'],
... ['sunhao', '2333']
... ]
>>> username = input('User name:')
>>> pin = input('PIN code:')
>>> if [username, pin] in database: print('Access granted')
2.6 长度、最大值和最小值
函数len返回序列包含的元素个数,而min和max分别返回序列中最小和最大的元素