WithCoderWithCoderWithCoder

Python基本数据类型之元组

    一、元组简介

    在 Python 中,元组(Tuple)与列表类似。两者之间的区别在于:元组不能更改,列表可以。也就是说,一旦被分配,就不能从元组中添加、更改或删除元素。

    二、元组的优点

    既然和列表类似,那元组的作用到底是什么呢?用列表代替不就可以了?

    与列表相比,元组有很多优点:

    • 通常将元组用于不同的数据类型,将列表用于相同(或相似)的数据类型。

    • 由于元组不可变,所以遍历元组比列表要快(较小的性能提升)。

    • 元组可以用作字典的 key,而列表不行。因为字典的 key 必须是不可变的,元组本身就是不可变的。

    • 如果数据不需要更改,将其作为元组来实现,可以确保“写保护”。

    • 元组可以被用在字符串格式化中。

    三、元组定义

    在 Python 中,元组由内置的 tuple 类型定义。要创建元组,需要将所有项(元素)放在括号(())内,以逗号(,)分隔。

>>> tup = ('h','e','l','l','o')
>>> tup
('h', 'e', 'l', 'l', 'o')
>>> type(tup)
<class 'tuple'>
>>>

    和列表一样,元组中的元素可以是任意数量,还可以是不同类型(例如:数字、字符串、列表等)。

>>> tup = () # 空元组
>>> tup
()
>>> tup = (1,2,'h','i') # 混合类型元组
>>> tup
(1, 2, 'h', 'i')
>>> tup = (1,2,('a','b')) # 嵌套元组
>>> tup
(1, 2, ('a', 'b'))
>>> a,b,c = tup # 解包元组
>>> a
1
>>> b
2
>>> c
('a', 'b')
>>>

    构造包含一个元素的元组时,还需要在元素后添加一个逗号,否则括号会被当作运算符使用。

>>> tup = ('h') # 只有括号
>>> type(tup)
<class 'str'>
>>> tup = ('h',) # 在元素后面添加逗号
>>> type(tup)
<class 'tuple'>
>>>

    通过以上结果可以看出,没有逗号就不是元组,加了逗号才是。

    四、访问元组

    元组和字符串、列表一样,都属于序列,因此,它的基本操作和字符串、列表是一样的。本文简单介绍元组访问

    4.1 索引

    可以使用索引操作符([]) 来访问元组中的一个元素

>>> tup = ('h','e','l','l','o')
>>> tup[0]
'h'
>>> tup[-5]
'h'
>>>

    4.2 切片操作符(:)

    使用切片操作符(:)来访问元组中的一系列元素    

>>> tup = ('h','e','l','l','o')
>>> tup[1:3]
('e', 'l')
>>> tup[:-3]
('h', 'e')
>>>

    其他的一些基本操作,例如:连接(+)、重复(*)、成员测试(in)、遍历(for)等,就不再详细介绍。

    五、更改元组

    元组是不可变的,也就是说,元组中的元素在被赋值后不能改变。但是,如果元素本身是一个可变数据类型的列表,那么其嵌套项可以被改变。

>>> tup = (1,2,['h','i'])
>>> tup[0] = 'a'  # 不能改变元素
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    tup[0] = 'a'
TypeError: 'tuple' object does not support item assignment
>>> tup[2][1] = 'o'  # 可变的元素可以被改变
>>> tup
(1, 2, ['h', 'o'])
>>>

    六、删除元组

    如上面介绍,不能更改元组中的元素,这也意味着无法删除元组中的元素。但是,使用关键字 del 可以删除整个元组

>>> tup = ('h','e','l','l','o')
>>> del tup[0] # 无法删除元素
Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    del tup[0]
TypeError: 'tuple' object doesn't support item deletion
>>> del tup # 可以删除整个元组
>>> tup
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    tup
NameError: name 'tup' is not defined
>>>

    或使用切片后再连接的方式,删除元组的元素

>>> tup = ('h','e','l','l','o')
>>> tup = tup[:2] + tup[3:] # 切片后再连接,删除元组元素
>>> tup
('h', 'e', 'l', 'o')
>>>

七、列表和元组互转

    7.1 列表和元组之间可以进行相互转换,分别使用 list() 和 tuple() 实现:

>>> tup = ('h','e','l','l','o')
>>> arr = list(tup) # 元组转换为列表
>>> type(arr)
<class 'list'>
>>> arr
['h', 'e', 'l', 'l', 'o']
>>> tup1 = tuple(arr) # 列表转换为元组
>>> type(tup1)
<class 'tuple'>
>>> tup1
('h', 'e', 'l', 'l', 'o')
>>>

    7.2 既然列表和元组可以互转,那么要改变元组,可以先将其转化为列表,对列表进行更改,然后再将列表转换为元组。

    举例,删除元组中的元素:

>>> tup = ('h','e','l','l','o')
>>> arr = list(tup) # 元组转换为列表
>>> del arr[1]
>>> tup = tuple(arr) # 列表转换为元组
>>> tup
('h', 'l', 'l', 'o')
>>>

    注意: 

    元组本身是不可变的。这里说的并不是传统意义的改变,相当于元组的重新赋值。

    八、元组的方法

    元组中的方法相对较少,可以通过 dir() 来查看方法列表:

>>> dir(tuple)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', 
'__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__',
'__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', 'count', 'index']
>>>

    可以看到,有两个可用的方法:

    8.1 index() 返回第一个匹配项的索引

>>> tup = ('h','e','l','l','o')
>>> tup.index('l') # 返回第一个匹配 'l' 的索引
2
>>>

    8.2 count() 统计某个元素在列表中出现的次数

>>> tup = ('h','e','l','l','o')
>>> tup.count('l') # 统计 'l' 在元组中出现的次数
2
>>>


欢迎分享交流,转载请注明出处:WithCoder » Python基本数据类型之元组