元组(Tuple)
上一篇我们讲完了 List(列表) ,今天我们讲讲他固执的弟弟 Tuple(元组) 。Tuple和他的大哥List长得很像,但是有个特点就是特别犟,认准的东西谁也改不了。
1. Tuple长啥样?
刚才说过 Tuple 和他的大哥 List 长得很像,我们来看一下:
>>> a = ['Think', 2019, 'Hello'] # 这是 List
>>> b = ('Mind', 2070, 'Sharry') # 这是 Tuple
标志
看吧,长的几乎一摸一样。从外观来看只有一个区别:List 的元素写在中括号 [] 里,Tuple的元素写在小括号 () 里。
元组索引
既然它们都是序列,我们就要知道 Tuple 和他的大哥 List 一样内部都有索引:
访问元组
既然元组已经有了索引,我们就可以用索引的方式来访问其中的元素,具体用法如下:
n 代表着索引为 n 的那个元素;
n: 代表着从序列为 n 的元素开始往后的所有元素(包含索引为n的元素);
:n 代表着截取索引为 n 的元素前面所有的元素(不包含索引为n的元素);
m:n 代表着从索引为 m 的元素开始截取,到索引为 n 的元素之前(包含索引为m的元素,不包含索引为n的元素),图示如下:
2. Tuple基本操作
刚才在上一篇文中我们了解完 List 后,其实理解 Turple 就很轻松了。List 中很多操作在 Turple 中都是通用的,不过也存在几点需要特别注意的:
创建
创建 Turple 时,用 () 创建,而不是像 List 一样用 [] :
>>> a = ('周媛','李布尔')
>>> a
('周媛', '李布尔')
单元素元组
当元组内只包含一个元素时,需要在该元素后边打上一个 , ,不然 () 容易被判断类型出错。我们在python内判断数据类型时,可以用 type(需要判断的对象) 来判断:
>>> a1 = ('王有才')
>>> a2 = ('王有才',)
>>> type(a1)
<class 'str'>
>>> type(a2)
<class 'tuple'>
不可变性
Tuple是序列中唯一的顽固派,这意味着一旦创建一个Tuple后,Tuple内的所有元素不能更新、不能替换、不能删除。这很固执,同时这意味着 Tuple 稳定性和安全度很高。
List转化为Tuple
事情都是有两面的,Tuple的顽固从另一方面看就是可靠。大家都很放心把元素交给它,因为无论如何它都不会随便改动。
这个特性让1年级的级部主任(参考上一篇文章)很感兴趣,他不想像上次一样让自己的数据随便被别人改了。级部主任准备用 tuple 列表名 的方式将1年级1班的名单List转换成了Tuple:
>>> one = ['周媛', ['李布尔', '杨九年'], ['王有才', '苏大强', '郑仕', '钱大彪', '钱大彪']]
>>> one = tuple(one)
('周媛', ['李布尔', '杨九年'], ['王有才', '苏大强', '郑仕', '钱大彪', '钱大彪'])
检验元素存在与否
级部主任想看看是不是原List中的每一个元素都被转化到新Tuple里了,他用 元素 in 元组 和 元素 not in 元组 来做了一下测试:
>>> one = ('周媛', ['李布尔', '杨九年'], ['王有才', '苏大强', '郑仕', '钱大彪', '钱大彪'])
>>> '周媛' in one
True
>>> '王有才' not in one
False
我们看到 ‘周媛’ 在元组里,但是 ‘王有才’ 不在,是因为 元素 in/not in 元组 只能检验某元素是否在某元组内,而显然 ‘王有才’ 并不是直接作为元素存在在one这个元组内的,他是作为 [‘王有才’, ‘苏大强’, ‘郑仕’, ‘钱大彪’, ‘钱大彪’] 这个元素内的元素存在的。
具体关系可以参考如下:
计数
这样,一个List就被转化成了Tuple。我们发现Tuple内部好像还存在List,我们来用 len() 的方式计算一下Tuple内部的元素数:
>>> len(one)
3
我们可以得知元组one内此时存在三个元素,说明内部的两个列表其实此时已经是Tuple内部的元素了。通过结果我们还可以得到一个结论:List可以作为元素出现在Tuple内部。
大小值的判断
像List一样,Tuple不仅仅可以计数还可以判断元组内所有元素的大小值:
1. 当元组内元素都为数字时:
>>> a = (3,4,8,14,26,87)
>>> max(a)
87
>>> min(a)
3
2. 当元组内元素都为单字母字符串时:
>>> a = ('c', 'e', 'g', 'k', 'o', 'y', 'z')
>>> max(a)
'z'
>>> min(a)
'c'
可重新定义
元组定义后就不能修改了,可是我们可以通过重新定义元组的方式来“修改”它。比如现在我们有一个这样的元组:
>>> a = ('王有才',)
现在我们想往里面添加一个 ‘钱大彪’ ,我们不能像 List 一样用一个 append 或者 insert 来添加,但是我们可以重新定义来再造它:
>>> a = ('王有才',)
>>> b = ('钱大彪',)
>>> a = a + b
>>> a
('王有才','钱大彪')
我们要知道,即使看起来很像在原元组上添加了一个元素而已,其实只是比着原元组的样子做了另一个后,再添加了一个新元组,明确这一点很重要。
元组加与乘的运算
除了上述例子中,对元组直接的加法运算外还可以对元组直接进行乘法,例如:
>>> a = ('王有才','钱大彪')
>>> a * 3
('王有才', '钱大彪', '王有才', '钱大彪', '王有才', '钱大彪')
可删除
顽固的Tuple一旦创建后,里面的元素它一概不让你删除,但是我们可以删除掉整个Tuple(看谁硬):
>>> a = ('王有才')
>>> del a
我们要明确的是,一旦用了 del 元组名 后Tuple就不存在了,原Tuple也不会变成空的:
>>> print(a)
NameError: name 'a' is not defined
我们打印一下就会发现,这时候原元组已经不存在了。