本系列要对Python在数据处理中经常用的列表(list)、元组(tuple)、字典(dictionary)、array(数组)-numpy、DataFrame-pandas 、集合(set)等数据形式的特征、常用操作进行详述。
今天,开启本系列的第三篇文章—Python数据系列(三)- 元组Tuple:Python的“不可变序列”。
元组Tuple具有如下的特点
- 不可变序列,元组中的元素是不允许删除的,但可以使用del语句来删除整个元组
- 元组是以圆括号“()”包围的数据集合,不同成员以“,”分隔
- 与列表不同:元组中数据一旦确立就不能改变
- 通过下标进行访问
声明:
L=(1,2,3)
含0个元素的元组: L = ()
含1个元素的元组:L=(1,) 注意有逗号
创建元组
In [1]: 1,2,3
Out[1]: (1, 2, 3)
In [2]: ()
Out[2]: ()
In [3]: (1,)
Out[3]: (1,)
In [4]: 32
Out[4]: 32
In [5]: 32,
Out[5]: (32,)
In [6]: (32,)
Out[6]: (32,)
In [7]: 3*(32+3)
Out[7]: 105
In [8]: 3*(32+3,)
Out[8]: (35, 35, 35)
复制代码
基本元组操作
In [9]: t=('a','b',(1,2))
In [10]: t[1] # 取元组内元素
Out[10]: 'b'
In [11]: t[2]
Out[11]: (1, 2)
In [12]: t[2][1]
Out[12]: 2
In [13]: t1=(12,13,14)
In [14]: t2=t1+t # 元组的+号连接
In [15]: t2
Out[15]: (12, 13, 14, 'a', 'b', (1, 2))
In [16]: del t2 # 删除元组
In [17]: t2
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-17-7ac3afd84e12> in <module>()
----> 1 t2
NameError: name 't2' is not defined
In [18]: list_a=[1,2,3]
In [19]: tuple(list_a) # list列表转化为元组
Out[19]: (1, 2, 3)
In [20]: tuple('abc') # str转化为元组
Out[20]: ('a', 'b', 'c')
In [21]: tuple('a','b','c')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-21-1b062a453ca1> in <module>()
----> 1 tuple('a','b','c')
TypeError: tuple() takes at most 1 argument (3 given)
In [22]: tuple((abc))
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-22-da0a3eef4197> in <module>()
----> 1 tuple((abc))
NameError: name 'abc' is not defined
In [23]: tuple((a,b,c))
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-23-1f4af24915b9> in <module>()
----> 1 tuple((a,b,c))
NameError: name 'a' is not defined
In [24]: tuple((1,2,3))
Out[24]: (1, 2, 3)
In [25]: len((1,2,3)) # 求元组长度
Out[25]: 3
In [26]: (1,2,3)+(4,5,6) # 元组连接
Out[26]: (1, 2, 3, 4, 5, 6)
In [27]: ("a")*4 # 字符串复制
Out[27]: 'aaaa'
In [28]: ("a",)*4 # 元组复制
Out[28]: ('a', 'a', 'a', 'a')
In [29]: 1 in (1,2,3) # 检查元素是否在元组内
Out[29]: True
In [30]: for x in (1,2,3): # 打印元组内元素
...: print(x)
...:
1
2
3
In [31]: max((1,2,3)) # 返回元组最大值
Out[31]: 3
复制代码
Python list和tuple的相互转换
list转为tuple:
temp_list = [1,2,3,4,5]
复制代码
将temp_list进行强制转换:
tuple(temp_list)
复制代码
查看是否转换成功:
print(type(temp_list))
复制代码
tuple 转为list:
temp_tuple = (1,2,3)
复制代码
方法类似,也是进行强制转换即可:
list(temp_tuple)
复制代码
查看是否转换成功:
print(type(temp_tuple))
复制代码
其实日常中,很少创建元组,但是遇到关于元组的问题,就很麻烦。这里挖个坑,希望有一天能够学习到更多关于元组的知识后,再次分享。
看了前面那么多对元组的介绍,可能会想有谁会需要像元组那样的不可变序列呢?难道就不能在不改变其中内容的情况下,坚持使用列表吗?
一般来说这是可行的。但是由于以下两个重要的原因,元组是不可能替代的:
- 元组可以在映射(和集合的成员)中当作键使用—而列表则不行;
- 元组作为很多内建函数和方法的返回值存在,也就是说你必须对元组进行处理,只要不尝试修改元组,那么,“处理”元组在绝大多数情况下就是把他们当作列表来进行操作(除去元组没有的方法,如index和count)
tuple 不可变的好处
相对于 list 而言,tuple 是不可变的,这使得它可以作为 dict 的 key,或者扔进 set 里,而 list 则不行。
tuple 放弃了对元素的增删(内存结构设计上变的更精简),换取的是性能上的提升:创建 tuple 比 list 要快,存储空间比 list 占用更小。所以就出现了“能用 tuple 的地方就不用 list”的说法。
多线程并发的时候,tuple 是不需要加锁的,不用担心安全问题,编写也简单多了。
原文链接:blog.csdn.net/ruanxingzi1…
一般来说,列表可能更能够满足对序列的所有需求,除特殊场景需要,推荐使用list列表。
本系列下一篇文章,我们探讨一下array(数组)-numpy,这是一个在AI领域常常被用到的数据形式。
往期回顾
- 知识图谱基础(一)- 什么是知识图谱
- 知识图谱基础(二)- 知识图谱的知识表达系统
- 知识图谱基础(三)- schema的构建
- Python数据系列(一)- 列表List:Python的“苦力”
- Python数据系列(二)- 字典Dictionary:Python的“大胃王”