Python 元组


2021年8月23日, Learn eTutorial
1876

在本 Python 教程中,您将掌握关于 Python 元组的所有知识,包括元组的创建、元组的索引和切片,以及您应该熟悉 的各种元组运算符和方法。

元组是经过良好排序的对象的集合,这些对象本质上是不可变的。元组与列表非常相似,它们都遵循序列,但元组不支持对象的变异性,而列表支持变异性。更具体地说,一旦创建了元组,就无法更改其对象,但我们可以轻松地更改列表中的对象。

Python 元组的关键特性

  • 元组本质上是不可变的
  • 元组保持对象的顺序
  • 元组支持索引
  • 元组可以包含异构对象
  • 元组是静态的
  • 元组允许重复值

如何定义 Python 元组

定义 Python 元组就像定义列表一样简单。Python 元组是通过将一系列有序对象括在括号或 **圆括号** () 中来定义的。每个对象都用 **逗号** , 分隔。尽管括号是可选的,但为了更好的编码和可读性,建议使用。下面的示例将有助于理解如何以不同的方式定义 Python 元组。

空元组:一个不包含任何元素的元组,长度为 0

示例:定义一个空元组

emp_tuple =()
 

单例元组:包含单个元素的元组。单例元组是通过在括号中将单个元素后跟一个逗号来定义的。在定义单个元素时,必须有一个尾随逗号,以强调这是一个元组,而不是一个表达式。

示例:定义一个单例元组

Sin_tuple =(10,)
 

同质元组:一个包含相同数据类型元素的元组

示例:定义一个同质元组

str_tuple =('a','b','x','y')
 

异构元组:一个包含各种数据类型元素的元组。

示例:定义一个包含整数、字符串和浮点数数据类型的异构元组

mix_tuple= (6,'Sixty',6.5)

嵌套元组:一个包含另一个元组的元组

示例:定义一个嵌套元组

nest_tuple=('prime',(1,2,3,5,7))

 

用于访问元组元素的索引和切片

从前面的教程中,我们已经熟悉了 Python 中的索引和切片方法。在元组中,索引和切片与列表的执行方式相同。我们可以使用索引和切片非常轻松地访问元组中的元素。

Python 元组中的索引

索引是为元组中的元素分配编号以便于访问的过程。索引始终从零开始,并且必须是整数。

Python 元组中有两种索引方式:

  • 正向索引 – 索引从 0 开始,从头部到尾部向前遍历。
  • 负向索引 – 索引从 -1 开始,从尾部到头部向后遍历。

为了彻底理解索引,让我们看一个示例及其可视化。“T”是一个 Python 元组变量,包含元素“cat”、“cow”、“dog”和“rat”。元组中的每个元素都根据其在正向和负向索引中的位置分配了一个编号,如下所示。

Python Tuple Indexing
  1. 通过正向索引获取元素

    可以通过引用索引号来访问 Python 元组中的单个元素。下面的代码展示了如何使用正向索引访问一个项。

    示例:通过正向索引获取单个元素

    T= ('Cat','Cow','Dog','Rat')
    print('Element accessed at index 1 is:',T[1])
    print('Element accessed at index 3 is:',T[3]) 
    

    输出

    Element accessed at index 1 is: Cow
    Element accessed at index 3 is: Rat
    
  2. 通过负向索引获取元素

    与 Python 列表一样,Python 元组也支持负向索引来从尾部访问项。负向索引始终从元组的末尾开始,索引从 -1 开始。

    示例:通过负向索引获取元素

    T= ('Cat','Cow','Dog','Rat')
    print('Element accessed at index -2 is:',T[-2])
    print('Element accessed at index -3 is:',T[-3]) 
    

    输出

    Element accessed at index -2 is: Dog
    Element accessed at index -3 is: Cow
    

Python 元组的切片

Python 元组也支持范围切片运算符 [:]。在这里,使用切片运算符,我们可以根据需要从元组中切片子序列。简而言之,我们可以使用切片运算符创建子元组。范围切片的语法是


T [ m:n]
 

其中 T 是包含项目的元组
m:起始索引
n:结束索引
T[m:n] 返回从索引 m 到索引 n 的子元组,但不包括索引 n
切片本身可以通过多种方式完成,使用正向和负向索引。切片可以通过将项目放在索引中间来最好地表示,如下所示。

Python Tuple Indexing

  1. 通过正向索引进行元组切片

    • 形式为 :T[m:n] 的切片返回从位置 m 到 n 的子元组,但不包括索引 n。

      示例:如何切片元组以获取从 m 到 n-1 的元素;

      T= ('Cat','Cow','Dog','Rat','Bat')
      print("T[1:4] =",T[1:4]) 
        
      输出
      T[1:4] = ('Cow', 'Dog', 'Rat')
      
    • 形式为 :T[:n] 的切片返回从默认起始位置到 n 的子元组,但不包括索引 n。

      示例:如何将元组从起始位置切片到第 n 个位置

      T= ('Cat','Cow','Dog','Rat','Bat')
      print("T[:4] =",T[:4]) 
        
      输出
      T[:4] = ('Cat', 'Cow', 'Dog', 'Rat')
      
    • 形式为 : T[m:] 的切片返回从位置 m 到最后一个索引的子元组。

      示例:如何将元组从第 m 个位置切片到末尾

      T= ('Cat','Cow','Dog','Rat','Bat')
      print("T[2:] =",T[2:]) 
        
      输出
      T[2:] = ('Dog', 'Rat', 'Bat')
      

  2. 通过负向索引进行元组切片

    • 形式为 :T[-m:-n] 的切片返回从位置 m 到 n 的子元组,但不包括索引 n。

      示例:如何使用负向索引将元组从 m 切片到 n

      T= ('Cat','Cow','Dog','Rat','Bat')
        print("T[-4:-2] =",T[-4:-2])

       

      输出

      T[-4:-2] = ('Cow', 'Dog')
      
    •  形式为 :T[:n] 的切片返回从默认起始位置到 n 的子元组,但不包括索引 n

      示例:如何使用负向索引将元组从起始位置切片到 n

      T= ('Cat','Cow','Dog','Rat','Bat')
        print("T[:-2] =",T[:-2])

       

      输出
      T[:-2] = ('Cat', 'Cow', 'Dog')
      
    • 形式为: T[-m: ] 的切片返回从位置 m 到最后一个索引的子元组。

      示例:如何使用负向索引将元组从第 m 个位置切片到末尾

      T= ('Cat','Cow','Dog','Rat','Bat')
        print("T[-4:] =",T[-4:])

       

      输出
      T[-4:] = ('Cow', 'Dog', 'Rat', 'Bat')
      

如何修改 Python 元组

不可变性是 Python 编程语言中数据类型元组的独特特性之一。更具体地说,一旦创建了元组,就无法更改或修改其中的元素。这意味着无法向元组添加、替换或删除元素。如果我们尝试修改元组,我们将收到一个 TypeError 而不是输出。

示例:演示元组的特性 - 不可变性


NT=('prime',[1,2,3,5,7])
NT[0]='ODD'
print(NT)
 

输出


TypeError: 'tuple' object does not support item assignment

但是,当元组中的元素是可变的时,情况就不同了。例如,元组可以包含列表作为其元素。列表是可变的,因此该元素可以被修改。如果您想在列表中添加另一个素数,可以按下面的示例添加。输出将是一个带有另一个素数 11 的附加列表。

示例:如何修改元组内的可变元素


NT=('prime',[1,2,3,5,7])
NT[1].append(11)
print("Modified List in NT is :",NT)
 

输出


Modified List in NT is : ('prime', [1, 2, 3, 5, 7, 11])

如何删除元组元素

考虑到元组是不可变的,无法删除或移除元组中的元素。但是,我们可以使用 del 关键字删除整个元组。如果我们尝试在删除后打印元组,将引发 NameError。

示例:如何删除元组

OT=(1,3,5,7,9)
del OT;
print(OT)
 

输出


print(OT)
NameError: name 'OT' is not defined

如何打包和解包 Python 元组

字面上讲,Python 元组是不同或相同项目的有序集合。我们通常使用赋值运算符 = 将右侧的项目赋给左侧的变量。Python 提供了特殊功能,将赋值运算符提升到一个新的水平。

它们是

元组的打包

示例:如何打包元组

T=('One','Two','Three','Four')
print("T[0] = ",T[0])
print("T[2] = ",T[2])
 

输出


T[0] =  One
T[2] =  Three

顾名思义,打包就是将一系列项目打包到一个变量中。将衣服装入袋子的现实生活示例与元组打包非常相似。打包可以如下所示。

Python Tuple Indexing

元组的解包

解包恰恰相反,即分配给元组变量的每个项目都被解包到新的元组中。再次以现实生活为例,从袋子中解包衣服,每件衣服将放在指定的架子上。解包可以如下说明。

Python Tuple Indexing

示例:如何解包元组

(n1,n2,n3,n4) = T
print("n1 contains :",n1)
print("n2 contains :",n2)
print("n3 contains :",n3)
print("n4 contains :",n4)
 

输出


n1 contains : One
n2 contains : Two
n3 contains : Three
n4 contains : Four

Python 允许通过将打包和解包结合到一个语句中来实现复合赋值。格式如示例所示。

示例:元组的复合赋值

(n1,n2,n3,n4)= ('One','Two','Three','Four') 
print("n2 contains :",n2)
print("n3 contains :",n3)
 

输出


n2 contains : Two
n3 contains : Three

解包时需要考虑的一个重要问题是,左侧的变量对象数量必须等于元组中的值数量。如果数量不匹配,将输出 ValueError 而不是结果。

解包元组时发生 ValueError


(n1,n2,n3) = T
(n1,n2,n3,n4,n5) = ('One','Two','Three','Four')
 

输出


ValueError: too many values to unpack (expected 3)
ValueError: not enough values to unpack (expected 5, got 4)

什么是 Python 中的嵌套元组?

与列表一样,元组也可以嵌套,这意味着一个元组可以包含另一个元组作为其元素,而后者可能又包含另一个元组。我们可以通过在 () 括号内放置逗号分隔的元素来定义嵌套元组。

示例:定义一个嵌套元组


nest_tuple=('prime',(1,(2,(4,8)),3,5,7))
 

如何从嵌套元组中访问元素

我们可以使用正向或负向索引从嵌套元组中访问元素。下面的示例为您提供了从嵌套元组中获取元素的思路。

示例:从嵌套元组中访问元素


nest_tuple=('prime',(1,(2,(4,8)),3,5,7))
#Positive indexing
print(nest_tuple[1])
print(nest_tuple[1][1])
print(nest_tuple[1][1][0])

#Negative indexing 
print(nest_tuple[-1])
print(nest_tuple[-1][-4])
print(nest_tuple[-1][-4][-1])

 

输出


i = 10
f = 10.55 
C = -5-6i

Python 元组成员验证

成员资格运算符用于验证元素或子元组是否存在于元组中。相应的输出将是一个布尔值,即 True 或 False。Python 中有两种成员资格运算符:

  • in:如果元素或子元组存在于提供的列表中,则返回 True
  • not in:如果元素或子元组不存在于提供的列表中,则返回 True。

T =('prime',1,3,5,7)
print("Validation 3 in tuple is ",3 in T)
print("Validation 8 not in List is",8 not in T)
 

输出


Validation 3 in List is True
Validation 8 not in List is True

Python 元组函数

Python 元组具有一些内置函数,用于执行一些常用的序列操作。基本函数如下表所示,以便于参考。

函数 描述
len(tuple) 返回元组的长度。
max(tuple) 返回元组中的最大值。
min(tuple) 返回元组中的最小值。
compare(T1,T2) 比较元组 T1 中的项与元组 t2 中的项
list(seq) 将列表转换为元组

Python 元组与 Python 列表的对比

我们已经学习了元组和列表。现在让我们总结一下 Python 元组和列表的重要相似点和区别。

相似之处

  • 元组和列表都属于序列数据类型
  • 元组和列表都可以包含任何类型的元素
  • 都可以使用索引访问它们。

区别

  • 元组是不可变的,而列表是可变的
  • 元组通常包含异构元素,而列表通常包含同质项
  • 元组是可哈希的,因此可以用作集合中的元素,而列表是不可哈希的,不能用作集合中的元素
  • 元组可以用作字典的键,但列表不能。
  • 元组不能被复制,而列表可以。
  • 元组的执行速度比列表快