本文最后更新于 258 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com
元组
基本操作
与列表类似,元组是一个有序序列,但是不可变。
元组用小括号()
生成:
t = (10, 11, 12, 13, 14)
t
(10, 11, 12, 13, 14)
可以索引,切片:
t[0]
10
t[1:3]
(11, 12)
元组是不可变的,不能通过赋值改变:
t[0] = 1
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Input In [5], in ()
----> 1 t[0] = 1
TypeError: 'tuple' object does not support item assignment |
单元素的元组生成
由于()在表达式中被应用,只含有单个元素的元组容易和表达式混淆,所以采用下列方式定义只有一个元素的元组:
a = (10)
a
10
type(a)
int
a = (10,)
a
(10,)
type(a)
tuple
列表与元组的转换
用构造方法list
和tuple
可以相互转换:
a = [10, 11, 12, 13, 14]
tuple(a)
(10, 11, 12, 13, 14)
a = (10, 11, 12, 13, 14)
list(a)
[10, 11, 12, 13, 14]
元组方法
由于元组是不可变的,所以只能有一些不可变自身的方法,例如计算元素个数.count()
方法和元素位置.index()
方法,用法与列表一样:
a = (10, 11, 12, 13, 14)
a.count(10)
1
a.index(12)
2
列表与元组的速度比较
IPython 中用 magic
命令 %timeit
来计时。
比较列表与元组的生成速度:
%timeit -n 100000 [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]
108 ns ± 5.29 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
%timeit -n 100000 (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25)
12.7 ns ± 2.44 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
在遍历上,元组和列表的速度表现差不多。
产生内容相同的随机列表和元组:
from numpy.random import rand
values = rand(10000,4)
lst = [list(row) for row in values]
tup = tuple(tuple(row) for row in values)
%timeit -n 100 for row in lst: tuple(row)
719 µs ± 52.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit -n 100 for row in tup: tuple(row)
514 µs ± 29.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
比较遍历和索引速度:
%timeit -n 100 for row in lst: a = row[0] + 1
2.61 ms ± 112 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit for row in tup: a = row[0] + 1
2.51 ms ± 88.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
总结:元组的生成速度会比列表快很多,迭代速度快一点,索引速度差不多。
元组与多变量赋值
Python支持多变量赋值的模式:
a, b = 1, 2
a
1
b
2
Python中的多变量赋值,本质是两个元组中的元素进行一一对应,此时,等号两边的元素数目必须相等。例如,将包含两个元素的元组t的值分别赋给a和b:
t = (1, 2)
a, b = t
a
1
利用多变量赋值,变量的交换可以用一行代码实现:
a, b = b, a
a
2
多变量赋值支持超过两个值的操作,只要等号两边的元素数相同:
a, b, c = 1, 2, 3
嵌套:
a, (b, c) = 1, (2, 3)
带星号的赋值,将后面的值都变成一个列表给某个变量赋值:
a, *b = 1, 2, 3
b
[2, 3]
a
1