python中常见的数据结构:列表-List、元祖-Tuple
- 列表和元祖都是一个可以放置任意数据类型的有序集合,对于大多数语言来说集合的数据类型必须一致,但是python却可以不相同,列表和元祖中的元素都可以随意嵌套
- 列表和元祖中的元素要是是字符时,需要用括号括起来
- 列表和元祖的区别:
1、列表是动态的,长度大小不固定,可以随意增加、删除、和改变元素,而不改变列表的变量名称
2、元祖是静态的,长度大小固定,无法增加,删除,和改变元素,如果想改变一个元祖,只能重新开辟一块内存空间,来创建一个新的元祖,
- 列表和元祖的基本操作以及注意事项
1、列表和元祖都支持 index索引 [] 、以及负数索引 [-1],
2、列表和元祖都支持切片操作,第二个:后面是步长,当步长是-1时,表示对列表反转
列表和元祖之间可以随意转换,通过tuple 和list转化
- 列表和元祖常见的内置函数
m.count(item) 、n.count(item) 统计列表、元祖中某一个元素出现的次数
m.index(item)、n.count(item) 统计列表、元祖中某一个元素第一次出现的index索引
m.reverse()、m.sort() 分别表示对列表进行原地反转和排序,但是元祖没有这两个方法,因为元祖不可变,
m.sort(reverse=True) 从大到小排序,m.sort(reverse=False) 从小到大排序
reversed(m)reversed(n)分别对列表和元祖进行反转,并返回一个新的倒转之后的迭代器,可以使用list、tuple进行转化
sorted(m,reverse=True)、 sorted(n,reverse=True),返回一个排序之后的新的列表,元祖也会被返回一个列表list
- 列表和元祖的存储方式,python中列表为了减少每次增加和删除操作时空间分配的开销,python每次分配空间都会额外多分配一些空间,这样的机制叫做 over-allocating,来保证操作的高效性
- 元祖长度大小固定,元素不可变,所以元祖的存储空间固定
- 列表和元祖性能
初始化一个列表和元祖,元祖的性能要比列表快10倍左右,通过python3 -m timeit "t=[]" 来获取创建list所需的时间
- 列表和元祖的使用场景
如果存储的数据是一个不变的值,使用元祖来存储
如果存储的数据是一个变化的值,使用列表来存储
列表中的每个元素都被分配一个数字作为索引,用来表示该元素在列表内所排在的位置。第一个元素的索引是0,第二个索引是1,依此类推,Python的列表是一个有序可重复的元素集合,可嵌套、迭代、修改、切片、追加、删除,成员判断
从数据结构角度看,Python的列表是一个可变长度的顺序存储结构,每一个位置存放的都是对象的指针。
- 列表的特殊操作
- 列表操作的常用函数
>>> l=['a',1,2,'c']
>>> max(l)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '>' not supported between instances of 'int' and 'str'
>>> min(l)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'int' and 'str'
>>>
注意:max、min在Python3中,不能对不同类型的对象进行大小的比较了。
- 列表遍历
- 列表操作的常用内置方法
根据以上代码的tracback可以知道,append()里面只能追加一个元素,sort()排序只能对相同类型的元素进行排序
- 列表与元祖相同操作
1、使用方括号加下标访问元素
2、切片(形成新元组对象)
3、count()/index()
4、len()/max()/min()/tuple()
- 列表与元祖的不同操作,(元祖中没有的功能)
1、修改、新增元素
2、删除某个元素(但可以删除整个元组)
3、所有会对元组内部元素发生修改动作的方法。例如,元组没有remove,append,pop等方法。
元组只保证它的一级子元素不可变,对于嵌套的元素内部,不保证不可变!
>>> tup = ('a', 'b', ['A', 'B'])
>>> tup[2][0] = 'X'
>>> tup[2][1] = 'Y'
>>> tup
('a', 'b', ['X', 'Y'])