Ⅰ.元组(tuple)
0x00 什么是元组
元组 (Tuple)
是 Python 中基本数据结构之一,与列表类似,但元组中的元素不允许被修改,因此元组也被称作只读列表。
元组使用小括号 - ()
包裹,元素间使用逗号 - ,
分隔,元组中的元素可以是字符串、数字、列表、元组等其他数据类型。
元组是序列,就像列表一样。元组和列表的主要区别在于元组中的不能更改(即元组不可变),而列表可以更改(可变)。
0x01 元组的创建
元组的创建和上节课讲的列表的创建方法类似:
① 直接创建,用小括号包裹,多个元素用逗号(,)分割
tuple0 = () # 创建一个空元组
tuple1 = ([1], "国庆节快乐!") # 创建包含一个字符串和一个列表的元组
tuple2 = ((1), 2)) # 创建一个包含两个元素的元组,元组也是可以嵌套的
② 使用函数tuple() 创建
tuple3 = tuple() # 等价与tuple0
tuple4 = tuple(()) # 等价与tuple0
tuple5 = tuple(([1], "国庆节快乐!")) # 搭建与tuple1
③ 直接使用,逗号分割元组中的每一个元素
tuple6 = 1, 2, 3 # 等价于 tuple6 = (1, 2, 3)
0x02 元组的访问
元组可以和列表一样使用下标来访问元组中的元素
t = (1, 2, 3)
print(t)
print(t[0])
print(t[1])
"""
输出:
(1, 2, 3)
1
2
"""
0x03 元组可不可以像列表一样修改添加元素呢?
❓ 元组能不能像列表一样修改添加删除元组的元素呢
t = (1, 2, 3)
t[0] = 3
元组修改元素 ❌
那删除元素呢?
t = (1, 2, 3)
del t[-1]
元组删除元素 ❌
很明显,元组是一个不可变的序列
注意:是元组内元素的地址,不是其中的值
也就是元素不允许被修改,但其元素的元素为可变类型时则支持修改。
t = (1,[1])
t[1][0] = 2
print(t) # 输出:(1, [2])
0x04 元组的遍历
元组和列表一样是一个可迭代对象
t = (1, 2, 3)
for i in t:
print(i)
0x05 元组生成式
同样也可以使用列表生成式来生成元组
如:
t = (i for i in range(100)) # 生成一个元素为0~99的元组
0x06 元组的优点
有些同学可能疑惑,有了列表为什么还需要元组呢?
确实列表足以使用于大部分开发场景。但是元组也有他的优点:
1.元组性能优于列表
元组占用的空间比列表少
我们仅仅定义了6个相同的元素,分配的空间大小就相差了快1倍!
a = [1, 2, 3, 4, 5, 6]
print('列表的空间大小为:', a.__sizeof__())
b = (1, 2, 3, 4, 5, 6)
print('元组的空间大小为:', b.__sizeof__())
如果再多一点
a = [i for i in range(100)]
print('列表的空间大小为:', a.__sizeof__())
b = (i for i in range(100))
print('元组的空间大小为:', b.__sizeof__())
这就差了将近10倍的大小
另外,在Python的垃圾回收机制下,如果一些变量不再使用了,Python会回收它们所占用的内存并返还给操作系统,以便让其他变量或其他应用使用这部分内存。
但是对于一些静态变量,比如元组,当它不被使用并且占用空间不大时,Python 会暂时缓存这部分内存。这样,下次我们再创建同样大小的元组时,Python 就可以不用再向操作系统发出请求,去寻找内存,而是可以直接分配之前缓存的内存空间,这样就能大大加快程序的运行速度!
2.元组可以作为字典key而列表不行
输入下面的代码执行的话会直接报错!
a = [1, 2]
b={a:1}
输出结果
而如果用元组作为字典的key的话则不会报错!
a = (1, 2)
b={a:1}
print(b)
输出结果
准确的说,所有不可变类型都可以,而类似list 的可变类型则不可以!!
预告:这里的字典我们在下节课会讲到
Ⅱ.真题回顾
在上一节课,我们最后的真题演练使用的是列表来解决。
元组的遍历会比列表快一些。
如果我们先把元组转为列表在变量是否会提高我们那题的执行速度呢?
我们先回顾一下题目要求
0x00 题目要求
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6 输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6 输出:[0,1]
0x01 代码实现
我们要先把列表转化成元组,所有一个要添加一行
nums = tuple(nums)
其他的只需要安装上一篇讲的来做就行了。
如果忘记了,那就点回去复习一下
完整代码:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
n = len(nums)
nums = tuple(nums)
for i in range(n):
for j in range(i + 1, n):
if nums[i] + nums[j] == target:
return [i, j]
return []
提交一下:
这是没有转成元组的提交记录
可以看到,代码耗时减少了100ms左右。