python 列表与元组 详解

索引

学习之前 先介绍一下索引在python中 有两种索引模式
正向索引:从左到右,起始位置 0
反向索引:从右到左,起始位置 -1

正向索引

来自菜鸟教程

反向索引

来自菜鸟教程

列表

列表是 Python 中最基本、最常见的数据结构。
列表中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。
列表都可以进行的操作包括索引,切片,加,乘,检查成员。

常见方法

方法介绍
list.append(obj)在列表末尾添加新的对象
list.count(obj)统计某个元素在列表中出现的次数
list.extend(seq)在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
list.index(obj)从列表中找出某个值第一个匹配项的索引位置
list.insert(index, obj)将对象插入指定位置
list.pop([index=-1])移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
list.remove(obj)移除列表中某个值的第一个匹配项
list.reverse()反向列表中元素
list.sort( key=None, reverse=False)对原列表进行排序
list.clear()清空列表
list.copy()复制列表

函数

函数介绍
len(list)列表元素个数
max(list)返回列表元素最大值
min(list)返回列表元素最小值
list(seq)将元组转换为列表

举例

实例-增

增加元素
 - append(item):将item添加到列表的最后位置。	
 - insert(pos,item):将item插入的指定位置。
 - pos如果超过最大索引,将item插入最后位置 	
 - pos如果小于最小索引,将item插入到最开始位置
 - extend(iterable):将序列内元素全部插入到尾部

举例

names = ['zs','ls','ww']
# 新增同学ml
names.append("ml")
print(names) # ['zs','ls','ww','ml'] #将内容追加到列表后

names.insert(0,'ml')
print(names) # ['ml', 'zs', 'ls', 'ww', 'ml']将ml插入到第一个位置
names.insert(1000,'111')
print(names)#['ml', 'zs', 'ls', 'ww', 'ml', '111'] 如果超过最大索引,将item插入最后位置
names.insert(-1000,'111')
print(names) #['111', 'ml', 'zs', 'ls', 'ww', 'ml', '111'] 在开始位置插入

names.extend([1,2,3,4]) 
print(names)# ['111', 'ml', 'zs', 'ls', 'ww', 'ml', '111', 1, 2, 3, 4]追加另一个序列
names.extend(range(1,100))
print(names) #['111', 'ml', 'zs', 'ls', 'ww', 'ml', '111', 1, 2, 3, 4, 1, 2, 3, 4, 5, 6,...]

实例-删

已知索引删元素,返回被删除的元素
 - pop():删除最后一个元素 	
 - pop(index):删除指定位置的元素。
 - 已知元素删元素:remove(item):删除第一次满足条件的指定元素,不存在会报错 
 - del 待删的对象,不属于列表特有
 - clear:清空列表,只剩空列表

举例

li = [1,2,3,4,5,6,2]

# pop
# 删除最后一个元素 	
li.pop()  
print(li) # [1, 2, 3, 4, 5, 6]
# 删除指定位置元素
li.pop(3) # 
print(li) #删除元素4 [1, 2, 3, 5, 6]
li.pop(100) # 报错,索引错误
print(li)

# # remove
li.remove(3)
print(li) # 删除元素3本身 [1, 2, 5, 6]
li.remove(10) # 错误,元素不存在
li.remove(2)
print(li)# 删除第一次出现的元素 2 [1, 5, 6]

# del
del li[2]
print(li) #删除下标是2的元素[1, 5]
li = [1,2,3,4,5,6,2]
del li[1:3] # 删除元素2,3
print(li) #[1, 4, 5, 6, 2]
del li # 删除列表li

# clear
li = [1,2,3,4,5,6,2]
li.clear() # []
print(li)

实例-改

通过操作来实现修改
 - 列表名[index] = new_value 	
 - reverse():列表倒序
 - sort():按照Unicode编码排序,同种类型才可以比较

举例

li = [1,2,3,4,5,6,2]
li[2] = 30
print(li) # 修改下标是2的内容[1, 2, 30, 4, 5, 6, 2]

# reverse() 列表倒序
li.reverse()
print(li) #反转列表  [2, 6, 5, 4, 30, 2, 1]

# sort 按照Unicode编码排序,同种类型才可以比较
li.sort()
print(li) #对原列表进行排序,按照Unicode编码排序,[1, 2, 2, 3, 4, 5, 6]
li2 = ['a','w','e','g']
li2.sort()
print(li2) # ['a','e','g','w']
li3 = ['你','好','大家好']
li3.sort()
print(li3) #['你', '大家好', '好']

实例-查

已知索引查元素: 列表名[index]
已知元素查索引:index(item):将第一个满足条件元素的索引值返回。(保证元素在列表中)
count(item):统计item在列表中出现的次数
li = [1,2,3,4,5,6,2]
p = li.index(2)
print(p) # 返回元素下标 1
li.index(10) # 报错

#count  统计在列表种出现的次数
print(li.count(10)) #0
print(li.count(2))#2
print(li.count(3))#1

元组

定义:元组是一个不可修改的,元素以逗号分隔的以小括号包围的有序序列。
特点:不可修改,有序的,序列。
格式: 元组名= (item1,item2,...)
由于元组不可改变,故没有增加和删除的方法

注意

空元组可以直接写一对圆括号 () ,
如果表示只包含 一个元素的元组,该元素后必	须添加逗号。

举例

t1 = () # 空元组
t2 = (1,) # 包含一个元素的元组
t3 = (1) # 仅表示数字1,不是元组类型

内置方法

方法介绍
len(tuple)计算元组元素个数。
max(tuple)返回元组中元素最大值。
min(tuple)返回元组中元素最小值。
tuple(iterable)将可迭代系列转换为元组。

元组运算符

符号介绍举例
+连接(1, 2, 3) + (4, 5, 6)
*复制(1,)*5
in、not in成员运算符判断值是否在元组内
#创建方式
t1 = (1, 10.31, 'python')
t2 = 1, 10.31, 'python'
print(t1, type(t1)) # (1, 10.31, 'python') <class 'tuple'>
print(t2, type(t2)) # (1, 10.31, 'python') <class 'tuple'>

#索引和切片
tuple1 = (1, 2, 3, 4, 5, 6, 7, 8)
print(tuple1[1])  # 2
print(tuple1[5:])  # (6, 7, 8)
print(tuple1[:5])  # (1, 2, 3, 4, 5)
tuple2 = tuple1[:]
print(tuple2)  # (1, 2, 3, 4, 5, 6, 7, 8)

#更新和删除
week = ('Monday', 'Tuesday', 'Thursday', 'Friday')
week = week[:2] + ('Wednesday',) + week[2:]
print(week)  # ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')

总结

不同点

基础

1:列表是动态的,长度大小不固定,可以随意地增加、删减或者改变元素。
2:元组是静态的,长度大小固定,无法增加删减或者改变。

存储方式

l = [1,2,3,4]
print(l.__sizeof__()) #72
tup = (1,2,3,4)
print(tup.__sizeof__())#56
"""
可以看出 元组的存储空间比列表小16字节
"""
原因
由于列表是动态的,所以它需要存储指针,来指向对应的元素(上述例子中,对于 int 型,8 字节)。
另外,由于列表可变,所以需要额外存储已经分配的长度大小(8 字节),这样才可以实时追踪列表空间的使用情况,当空间不足时,及时分配额外空间。
深入
#列表
l = []
print(l.__sizeof__())  #空列表的存储空间为40字节
t = ()
print(t.__sizeof__()) #空列表的存储空间为24字节
l.append(1)
print(l.__sizeof__())#72 加入了元素1之后,列表为其分配了可以存储4个元素的空间
l.append(2)
print(l.__sizeof__())#72
l.append(3)
print(l.__sizeof__())#72
l.append(4)
print(l.__sizeof__())#72
l.append(5)
print(l.__sizeof__())#104 加入元素5之后,列表的空间不足,所以又额外分配了可以存储4个元素的空间

#元组
t = ()
print(t.__sizeof__()) #空列表的存储空间为24字节
t =(1,)
print(t.__sizeof__()) #空列表的存储空间为32字节
t =(1,2)
print(t.__sizeof__()) #空列表的存储空间为40字节
t =(1,2,3)
print(t.__sizeof__()) #空列表的存储空间为48字节
说明
上面的例子,大概描述了列表空间分配的过程。
我们可以看到,为了减小每次增加 / 删减操作时空间分配的开销,Python 每次分配空间时都会额外多分配一些,这样的机制保证了其操作的高效性:增加 / 删除的时间复杂度均为 O(1)。
但是对于元组,情况就不同了。元组长度大小固定,元素不可变,所以存储空间固定。

相同点

  • Python 中的列表和元组都支持负数索引
  • 列表和元组都支持切片操作
  • 列表和元组都可以随意嵌套
  • 两者也可以通过 list() 和 tuple() 函数相互转换

最后

列表和元组的性能
元组要比列表更加轻量级一些,所以总体上来说,元组的性能速度要略优于列表。
列表和元组的使用场景
如果存储的数据和数量不变,选用元组更合适。
如果存储的数据或数量是可变的,则用列表更合适。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值