注:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性。
数据收纳盒
收纳数据对象的数据类型,以一种规则的下标索引方式访问到每个数据,是一种序列(sequence)。序列可以看作是数据收纳盒,它能收纳数字、字符串等基本数据类型,并将之编好有序的号码进行存放。这种编号就是索引(index)。
列表(list)和元组(tuple)均属于序列。
列表可以删除、添加、替换、重排其中的元素,是可变(mutable)序列类型。
元组不能更改,和字符串一样,是不可变(immutable)序列类型。凡是涉及到元组、字符串等不可变序列类型的各种改变如删除、添加、替换、重排等操作,都是生成一个新的元组、字符串,而原来的元组和字符串均保持不变。
关于序列的更多详细内容请见:Python随笔:Python内置序列函数之enumerate函数的前半部分。
上一节说过,字符串有两套编号:
- 从左向右的编号,采用非负整数编号。从0开始编号,向右依次加1。对s = 'abc'而言,s[0] = 'a'表示s的第1个元素,s[1] = 'b'表示s的第2个元素,依此类推。
- 从右向左的编号,采用负整数编号。从-1开始,向左依次减1。对s = 'abc'而言,s[-1] = 'c'表示s的倒数第1个元素,s[-2] = 'b'表示s的
倒数第2个字符,依此类推。
列表和元组也是一样的。如下所示:
l = ['a', 'b', 'c']
l[0]
Out[2]: 'a'
l[-1]
Out[3]: 'c'
t = ('a', 'b', 'c')
t[0]
Out[5]: 'a'
t[-1]
Out[6]: 'c'
列表和元组其余的操作如切片、查找(in、index、count)跟字符串相同,还有计算(sum、min/max)也是如此。
ls = ["cat", "dog", "tiger", 1024]
ls[1: 2] = [1, 2, 3, 4] #切片
print(ls)
列表、元组的创建
#创建列表:
l = []
l = list()
l = [x for x in iterable] #使用列表推导式创建列表。
#创建元祖:
t = ()
t = tuple()
元祖的单例(singleton)
元组还可以是单例(singleton),即只有一个元素在里面,如:
t1 = ('a', )
值得注意的是,当元组是单例时,里面仅有的1个元素后面必须跟一个逗号“,”。逗号“,”表明了这是个元组里面的元素,而不是只是一个字符串或者数字或者字符等;若没有逗号,则括号会被当作是运算的符号。
元组甚至也可以不要括号,直接用“,”。所以,对元组而言,括号可以没有,但逗号一定要有。
t1 = ('a',) # 带“,”的才是元组
type(t1)
Out[8]: tuple
t2 = ('a') # 不带“,”是字符串或整数。
type(t2)
Out[10]: str
type(t3)
Out[12]: tuple
t4 = 1, 2, 3
type(t4)
Out[14]: tuple
列表的可变性
列表有一个非常重要的与众不同之处,那就是列表是可变的(mutable)。
这个特性与其它数据类型都不相同,因为int、float、string和tuple等数据类型一旦创建后都是不可变的(immutable)。你不能通过访问string或者tuple里的某个元素来改变他们。比如tuple一旦下了定义,再想用tuple[0]= 2这种赋值方法改变tuple时,系统将会报错。
而列表lists则可以通过访问某些内部元素进而改变它们的值,有时候这是非常方便的。
可变性使得程序可以被更灵活地处理。尽管如此,同样也很容易造成程序设计错误。
l = [1, 2, 3, 4]
l[0] = ['a']
l[-1] = 'd'
l
Out[18]: [['a'], 2, 3, 'd']
列表的操作
s.append(x)——将 x 添加到序列的末尾 (等同于 s[len(s):len(s)] = [x])。
s.insert(i, x)——在由 i 给出的索引位置将 x 插入 s (等同于 s[i:i] = [x])。
s.extend(t) 或 s += t——用 t 的内容扩展 s (基本上等同于 s[len(s):len(s)] = t)。
s.pop([i])——提取在 i 位置上的项,并将其从 s 中移除。可选参数 i 默认为 -1,因此在默认情况下会移除并返回最后一项。
s.remove(x)——删除 s 中第一个 s[i] 等于 x 的项目。当在 s 中找不到 x 时 remove() 操作会引发 ValueError。返回值为None。
s.clear()——从 s 中移除所有项 (等同于 del s[:])。包括 clear() 和 copy() 是为了与不支持切片操作的可变容器 (例如 dict 和 set) 的接口保持一致。
s.reverse()——就地将列表中的元素逆序。当反转大尺寸序列时 reverse() 方法会原地修改该序列以保证空间经济性。 为提醒用户此操作是通过间接影响进行的,它并不会返回反转后的序列。
s.sort(*, key=None, reverse=False)——此方法会对列表进行原地排序,只使用 < 来进行各项间比较。 异常不会被屏蔽 , 如果有任何比较操作失败,整个排序操作将失败(而列表可能会处于被部分修改的状态)。
合并:加法运算+,连接2个列表,生成1个新的列表。
下面是列表操作的一些例子:
l = [1, 2, 3, 4]
l[0] # 访问l中的index=0(即列表中的第1个)的元素。
Out[20]: 1
l.append(5) # 在l的尾部添加一个新的元素。
l
Out[22]: [1, 2, 3, 4, 5]
l.reverse() # 使l中的元素逆序排列,并改变了l自身。
l
Out[24]: [5, 4, 3, 2, 1]
l.clear() # 清空l中的所有元素,使得l成为一个空列表。
l
Out[26]: []
[1, 2, 3] + [4, 5]
Out[27]: [1, 2, 3, 4, 5]
To be continued.