python
元组
说明
《Python 教程》 帮助读者成为泛程序员,持续修订中,提供建议、纠错、催更加微信 gairuo123。查看 更新日志。作者开办 Python 数据分析培训,详情 Python 数据分析培训。
![]() |
本教程作者所著新书《深入浅出Pandas:利用Python进行数据处理与分析》(ISBN:9787111685456)已由机械工业出版社出版上市,各大电商平台有售,欢迎:查看详情并关注购买。 |
元组(tuple)跟列表(list)非常相似,二者之间的差异就是元组(tuple)不可改变(包括值和位置顺序),列表(list)是可以改变的。元组使用小括号(...)
,列表使用方括号。
元组的结构和列表一样,元组用圆括号把所有项括起来,元素之间用逗号分隔:
a = () # 空元组
a = (1, ) # 只有一个元素
a = (1, 2, 3) # 定义一个元组
tuple() # 生成空元组
tuple('hello') # ('h', 'e', 'l', 'l', 'o')
type(a) # tuple 元素检测
# 没有括号也可以定义一个元组
a = 1,23,4,56 # a: (1, 23, 4, 56)
a = 1, # a: (1, )
# 元组内元素可以混杂其他类型
a = ('a', 1.5, True, [2, 3, 4]) # 各种类型混杂
使用内置构造器函数 tuple(),是一个非常直观的创建元组方法。
元组的索引机制跟列表完全一样,可参考列表。
元组是不可修改的,我们修改元素时,就会报错。但是,我们可以修改混杂类型里的列表类型数据。
a = ('a', 1.5, True, [2, 3, 4])]
a[-1].append(5)
# ('a', 1.5, True, [2, 3, 4, 5])
del a # 删除整个元组
+
、*
、in
和列表一样。
a = (1, 2, 3)
len(a) # 3 元素个数
max(a) # 3 最大值
min(a) # 1 最小值
sum(a) # 6 求和
a.count(1) # 1 求元素的个数
a.index(2) # 1 指定元素位置
for i in a: print(i) # 迭代元素
sorted(a) # 返回一个排序的列表,但不改变原列表
any(a) # True 是否至少有一个元素为真
all(a) # True 是否所有元素为真
tuple.__dir__('') # 查看元组支持的所有函数和方法
可将元组利用推荐式生成列表,也可用以下方式生成元组:
t = tuple((i for i in range(3)))
# t: (0, 1, 2)
在「变量」一节里我们说过可以利用元组 a,b,c,d = 1,2,3,4
批量定义变量,我们也可以用以下方法更加灵活地定义变量。可以想象当一个包里的东西很多,但是分的人不够,指定的人占的多一些:
x = (1,2,3,4,5)
a, *b = x # a 占第一个,剩余的组成列表全给 b
# a -> 1
# b -> [2, 3, 4, 5]
# a, b -> (1, [2, 3, 4, 5])
a, *b, c = x # a 占第一个,c 占最后一个, 剩余的组成列表全给 b
# a -> 1
# b -> [2, 3, 4]
# c -> 5
# a, b, c -> (1, [2, 3, 4], 5)
在访问元组数据的时候我们发现,要取指定的数据需要知识它所在的索引位置,不是很方便。命名元组可以解决这个问题,如:
from collections import namedtuple
Girl = namedtuple('Girl', ['name', 'age'])
lily = Girl('lily', 10)
lily.name # lily
lily.age # 10
lily
# Girl(name='lily', age=10)
type(lily)
# __main__.Girl
# 不能被修改
lily.age = 12
# AttributeError: "can't set attribute"
命名元组使用时需要导入内置包,使用类(后边有讲解)的方法进行初始化和调用。和元组的特性一样,命名元组不能被修改。
圆括号(注:它不是元组)的字符串仍然是一个字符:
('b' 'c')
('b''c')
('bc') # 特别注意
# 'bc'
如果想定义一个单元素的元组,需要加一个逗号:
('b' 'c',)
('b''c',)
('bc',)
# ('bc',)
type(('bc',))
# tuple
另一个陷阱是,可以使用 tuple() 函数来使用显式元组构造函数。这确实会创建一个元组对象,但当向该函数传递字符串时,它会为每个项创建一个具有一个字符的元组:
tuple("abc")
# ('a', 'b', 'c')
请注意决定生成元组的其实是逗号而不是圆括号。 圆括号只是可选的,生成空元组或需要避免语法歧义的情况除外。 例如,f(a, b, c) 是在调用函数时附带三个参数,而 f((a, b, c)) 则是在调用函数时附带一个三元组。以下方式都可以构建一个元组:
元组实现了所有 一般 序列 的操作。
对于通过名称访问相比通过索引访问更清晰的异构数据多项集,collections.namedtuple() 可能是比简单元组对象更为合适的选择。