【Python数据分析基础-4】数据结构之元组
0. 引入
从这篇文章开始,我将介绍Python的常用的数据结构:元组、列表、字典和集合。这篇文章中,将会着重介绍元组。元组是一种固定长度、不可变的Python对象序列。
1. 创建元组
元组最简单的创建方法是用逗号分隔序列值,如下:
tup = 1, 2, 3
tup
- 时间戳
- 格式化的时间字符串
- time模块的time.struct_time类
- datetime模块的datetime类
其中时间戳(imestamp) 又称为Unix时间、POSIX时间。它表示从格林尼治时间1970年1月1日0时0分0秒开始到现在所经过的毫秒数,其值为float类型。 但Python返回的是秒数,需要说明的是时间戳是个差值,其值与时区无关。
格式化的时间字符串是形如’2022-01-01 13:14:52’的字符串
time模块和datetime模块我将在下面进行介绍。
# 结果为
(1, 2, 3)
元组的元素设置比较自由,当你想通过更复杂的表达式来定义元组时,将各具体元素用逗号隔开即可,如下:
tup1 = [1, 2], (3, 4)
tup2 = (5, 6), (7, 8)
tup3 = [9, 10], True, 0
print(tup1, type(tup1))
print(tup2, type(tup2))
print(tup3, type(tup3))
# 结果为
([1, 2], (3, 4)) <class 'tuple'>
((5, 6), (7, 8)) <class 'tuple'>
([9, 10], True, 0) <class 'tuple'>
当然,你也可以通过tuple
函数将任意序列或迭代器转换为元组:
print(tuple([1, 2, 3, 4]))
print(tuple('tuple'))
# 结果为
(1, 2, 3, 4)
('t', 'u', 'p', 'l', 'e')
2.元组元素操作
元组中的元素可以通过中括号[]
来获取,当然,在大多数序列类型中都可以使用该方法。Python中的序列索引时从0开始。
tup3 = [9, 10], True, 0
print(tup3[0])
# 结果为
[9, 10]
元组一经创建,各个位置上的对象是无法被修改的!!!!但是对象其自身是可变的!
tup = [1, 2, 3, 4, 5], True, 0, 'tuple'
print(tup[0])
print(tup[2])
# 结果为
[1, 2, 3, 4, 5]
0
下面我们尝试修改一下元组中的对象,将元组的第三个元素变为1:
tup[2] = 1
# 结果为
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-16-bb6d2a2e4378> in <module>
----> 1 tup[2] = 1
TypeError: 'tuple' object does not support item assignment
报错了TypeError: 'tuple' object does not support item assignment
,表示“tuple”对象不支持元素分配,即你不可修改元组各位置的对象!
但是如果元组中储存的对象其自身是可变的,例如列表,你可以在它内部进行修改,如下:
tup[0].append(6)
tup
# 结果为
([1, 2, 3, 4, 5, 6], True, 0, 'tuple')
可以发现tup[0]
是列表[1, 2, 3, 4, 5]
,tup[0].append(6)
即在列表后面加入元素6
.
除此之外,可以用+
号连接元组来生成更长的元组:
tup1 = [1, 2], (3, 4)
tup2 = (5, 6), (7, 8)
tup3 = [9, 10], True, 0
tup1 + tup2 + tup3
# 结果为
([1, 2], (3, 4), (5, 6), (7, 8), [9, 10], True, 0)
又可以将元组乘以整数,生成含有多份拷贝的元组:
tup1 * 5
# 结果为
([1, 2],
(3, 4),
[1, 2],
(3, 4),
[1, 2],
(3, 4),
[1, 2],
(3, 4),
[1, 2],
(3, 4))
3. 元组拆包
如果你想要将元组型的表达式赋值给变量,Python会对等号右边的值进行拆包:
tup = (1, 2, 3)
a, b, c = tup
print(b)
# 结果为
2
即使是嵌套元组也可以进行拆包:
tup = 1, 2, (3, 4)
a, b, (c, d) = tup
print(c)
# 结果为
3
拆包功能,是你可以轻易地交换变量名,在其他编程语言中,更换变量名可能需要一个中间变量,但在Python中交换可以如下完成:
a, b = 1, 2
b, a = a, b
a, b
# 结果为
(2, 1)
Python提供了更为高级的元组拆包功能,这个功能使用特殊的语法"*rest",用于在函数调用时获取任意长度的位置参数列表:
tup = 1, 2, 3, 4, 5, 6
a, b, *rest = tup
print(a, b)
print(rest)
# 结果为
1 2
[3, 4, 5, 6]
“rest"这个变量名并不是固定的,没有什么特殊之处,你也可以把*后面的rest换成其他变量名。不过为了方便,很多编程者会使用下划线”_"来表示不要的变量,如下:
tup = 1, 2, 3, 4, 5, 6
a, b, *_ = tup
print(_)
# 结果为
[3, 4, 5, 6]
需要注意的是这个高级拆包功能返回的是一个列表,而不是元组。
4. 元组方法
由于元组的内容是无法改变的,它的实例方法很少,一个常见的方法是count,用于计量某个数值在元组中出现的次数:
a = (1, 1, 2, 3, 1, 4, 5, 1)
a.count(1)
# 结果为
4
下一篇我将介绍数据结构中的列表!