Python容器专题 - 元组(tuple)
1 元组用法
1.2 创建元组:
tuple1 = () # 创建一个空元组 tuple2 = (1, 2) # 通过列举成员直接创建一个一维元组 tuple3 = ((1,2,3),(4,5,6),(7,8,9)) # 通过列举成员直接创建一个二维元组 tuple4 = tuple([1,2,3]) # 通过强制类型转换将列表转换为元组(也可以是其它支持的结构) tuple5 = 1, 2, '3','4', 5 # 创建序列甚至可以不写小括号,且其成员支持任意类型 tuple6 = tuple4, (1, 2, 3, 4, 5) print(tuple1,'\n',tuple2,'\n',tuple3,'\n',tuple4,'\n',tuple5,'\n',tuple6)
Out[]:
() (1, 2) ((1, 2, 3), (4, 5, 6), (7, 8, 9)) (1, 2, 3) (1, 2, '3', '4', 5) ((1, 2, 3), (1, 2, 3, 4, 5))
1.3 索引元组与反索引:
1.3.1 索引 - 获取元组中的元素
a_tuple = tuple(range(10)) t_3 = a_tuple[2] # a_tuple的第3个元素 t_36 = a_tuple[2:6] # a_tuple的第3个元素到第6个元素构成的子元组 print(a_tuple, '\n',t_3 ,'\n',t_36)
Out[]:
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 2 (2, 3, 4, 5)
1.3.2 反索引 - 获取元素首次出现时的索引号
a_tuple = 9,2,'G',7,'A',1,[0,1],'3',1,6,3,'B' index_A = a_tuple.index('A') print('字符"A"在元组a_tuple中首次出现的索引为:', index_A )
Out[]:
1在元组a_tuple中出现的次数为: 2 字符"A"在元组a_tuple中首次出现的索引为: 4
1.4 统计元组
a = (6,4,7,8,9,2,4) len(a) # 获取元组a中的元素个数,结果为 7 max(a) # 求元组a中的最大值,结果为 9 min(a) # 求元组a中的最小值,结果为 2
1.5 元素存在性
a = ("老虎","狮子","豹子","袍子","猴子","猩猩","狗熊") "北极熊" in a # 判断某元素是否在元组a中,结果为 False “"猴子" in a # 结果为 True "袍子" not in a # 结果为 False
1.7 删除元组
a = () del a
2. 元组与列表的异同
元组(tuple)是不可变序列类型
,而列表(list)是可变序列
,不可变序列类型和可变序列区别如下:
不可变序列类型
- 不可变序列类型普遍实现而可变序列类型未实现的唯一操作就是对 hash() 内置函数的支持。
- 这种支持允许不可变类型,例如 tuple 实例被用作 dict 键,以及存储在 set 和 frozenset 实例中。
- 尝试对包含有不可哈希值的不可变序列进行哈希运算将会导致 TypeError。
可变序列类型
- 以下表格中的操作是在可变序列类型上定义的。 collections.abc.MutableSequence ABC 被提供用来更容易地在自定义序列类型上正确实现这些操作。
- 表格中的 s 是可变序列类型的实例,t 是任意可迭代对象,而 x 是符合对 s 所规定类型与值限制的任何对象 (例如,bytearray 仅接受满足 0 <= x <= 255 值限制的整数)。
3. 元组推导式
3.1 通过推导式获得元组
我们在学习列表(list)时提到了用 “列表推导式” 获得列表,实际上我们还可以用同样的办法获得元组。如:
tuple((i for i in range(5)))
这样我们就获取了一个元组(0, 1, 2, 3, 4)
。
3.2 不要与生成器(Genarator)
混淆
可能你已经注意到了,我们写列表生成式的时候写的是:
[i for i in range(5)]
而不会多此一举地写成:
list([i for i in range(5)])
即可以得到列表[0,1,2,3,4]
。
那么为什么到了元组这而,我们不直接写成:
(i for i in range(5))
的形式呢?其实,如果不使用tuple()
语句,在元组中直接使用这种写法根本不会得到元组,而是得到一个生成器对象,如图所示:
生成器(Genarator)提供了一种一不安循环一边计算的机制,可以边推导边把推到的值传递出去,而不需要等到所有值计算完成。