深入剖析 Python 最常用数据结构:列表(List) & 元组(Tuple)

2023-10-27

1. 定义

列表元组,都是一个可以放置任意数据类型的有序集合。

在大多数编程语言中,集合内元素的数据类型必须保持一致,但在 Python 的列表与元组中,没有这个约束。

示例

列表 List = [‘Tom’, 22, 33, ‘tony’]

元组 Tuple = (‘China’, 10)

如上列表与元组的示例,列表与元组集合内同时存放了 int 类型和 string 类型的元素

2. 区别

列表是动态的,长度大小不固定,可以随意地新增、删除、修改集合内元素

input:

test_list = ['Tom', 22, 33, 'tony']
test_tuple = ('jack', 10)

# test_list新增元素
test_list.append('100')
test_list.append('200')
print(test_list)

# test_list修改元素
test_list[0] = 'xiaomin'
print(test_list)

# test_list删除元素
test_list.pop()
print(test_list)

output:

['Tom', 22, 33, 'tony', '100', '200']
['xiaomin', 22, 33, 'tony', '100', '200']
['xiaomin', 22, 33, 'tony', '100']

从输入,输出可以证明列表支持集合内元素的新增、删除、修改

元组是静态的,长度大小固定,不可以新增、删除、修改集合内元素

input:

test_tuple = ('jack', 10)

# test_tuple修改元素
test_tuple[0] = 'xiaomin'
print(test_tuple)

output:

Traceback (most recent call last):
  File "test001.py", line 5, in <module>
    test_tuple[0] = 'xiaomin'
TypeError: 'tuple' object does not support item assignment

从输入,输出可以证明元组不支持集合内元素的修改,新增和删除也不支持,大家可以自己动手实验下。

这也证明了Python中元组是静态不可变的。如果就想在原有元组集合中添加元素,有没有办法可以实现呢?

答案:“有的”,见如下示例

input:

test_tuple = ('jack', 10)
new_test_tuple = test_tuple + (20, 'xiaomin')
print(new_test_tuple)

output:

('jack', 10, 20, 'xiaomin')

虽然能实现想要的效果,但并不是真正意义上的原元组集合基础上元素的添加,而是创建了一个新的元组 new_test_tuple 来实现。

3. 索引

Python 中的列表和元组都支持正负数索引,正常索引区间,非正常索引区间取值。验证如下:

input:

test_list = [100, 200, 300, 400, 500]
# 列表支持区间索引取值: 取索引下标为1至倒数第2个元素之间的所有元素,规则:左闭右开
print(test_list[1:-1])
# 列表支持单个正数索引取值: 取正数第2个元素
print(test_list[2])
# 列表支持单个负数索引取值: 取倒数第2个元素
print(test_list[-2])
# 列表支持非区间索引取值: 从倒数第2个元素一直往前取所有
print(test_list[:-1])
print("*" * 20)

test_tuple = ('jack', 10, 20, 'tom')
# 元组支持区间索引取值: 取索引下标为1至倒数第2个元素之间的所有元素,规则:左闭右开
print(test_tuple[1:-1])
# 元组支持单个正数索引取值: 取正数第2个元素
print(test_tuple[2])
# 元组支持单个负数索引取值: 取倒数第2个元素
print(test_tuple[-2])
# 元组支持非区间索引取值: 从倒数第2个元素一直往前取所有
print(test_tuple[:-1])

output:

[200, 300, 400]
300
400
[100, 200, 300, 400]
********************
(10, 20)
20
20
('jack', 10, 20)
4. 嵌套 & 数据类型强转

列表和元组都可以随意嵌套和数据类型转换,见如下示例。

1). 嵌套

input:

# 列表内的元素支持嵌套,元素可以是一个列表
test_list = [[100, 200, 300], [400, 500]]
print("test_list列表中第1个元素的数据类型,{}".format(type(test_list[0])))
# 元组内的元素支持嵌套,元素可以是一个元组
test_tuple = (('jack', 10, 20, 'tom'), (4, 5, 6))
print("test_tuple列表中第1个元素的数据类型,{}".format(type(test_tuple[0])))

output:

test_list列表中第1个元素的数据类型,<class 'list'>
test_tuple列表中第1个元素的数据类型,<class 'tuple'>
2). 数据类型强转

input:

test_list = [100, 200, 300]
print("test_list列表使用tuple()函数进行强转后,元素输出结果为:{}".format(tuple(test_list)))
print("test_list列表使用tuple()函数进行强转后,元素所属数据类型输出结果为:{}".format(type(tuple(test_list))))
print("*" * 60)
test_tuple = ('jack', 10, 20, 'tom')
print("test_tuple元组使用list()函数进行强转后,元素输出结果为:{}".format(list(test_tuple)))
print("test_tuple元组使用list()函数进行强转后,元素所属数据类型输出结果为:{}".format(type(list(test_tuple))))

output:

test_list列表使用tuple()函数进行强转后,元素输出结果为:(100, 200, 300)
test_list列表使用tuple()函数进行强转后,元素所属数据类型输出结果为:<class 'tuple'>
************************************************************
test_tuple元组使用list()函数进行强转后,元素输出结果为:['jack', 10, 20, 'tom']
test_tuple元组使用list()函数进行强转后,元素所属数据类型输出结果为:<class 'list'>
5. 常用内置函数
1). count(item)

表示统计列表 / 元组中 item(元素) 出现的次数

input:

test_list = [100, 200, 300, 100, 400]
test_tuple = ('jack', 10, 20, 'tom', 10, 20, 10)
print("test_list列表中统计元素100出现的次数为:{}".format(test_list.count(100)))
print("test_tuple元组中统计元素10出现的次数为:{}".format(test_tuple.count(10)))

output:

test_list列表中统计元素100出现的次数为:2
test_tuple元组中统计元素10出现的次数为:3
2). index(item)

表示返回列表 / 元组中 item(元素) 第一次出现的索引值

input:

test_list = [100, 200, 300, 100, 400]
test_tuple = ('jack', 10, 20, 'tom', 10, 20, 10)
print("test_list列表中返回元素100第1次出现的索引值为:{}".format(test_list.index(100)))
print("test_tuple元组中返回元素10第1次出现的索引值为:{}".format(test_tuple.index(10)))

output:

test_list列表中返回元素1001次出现的索引值为:0
test_tuple元组中返回元素101次出现的索引值为:1
3). list.reverse()

表示原地倒转列表(注意:元组没有这个内置函数)

input:

test_list = [100, 200, 300, 100, 400]
test_list.reverse()
print("test_list列表原地倒转后返回元素为:{}".format(test_list))

output:

test_list列表原地倒转后返回元素为:[400, 100, 300, 200, 100]
4). list.sort()

表示排序列表(注意:元组没有这个内置函数)

input:

test_list = [100, 200, 300, 100, 400]
test_list.sort()
print("test_list列表原地倒转后返回元素为:{}".format(test_list))

output:

test_list列表原地倒转后返回元素为:[100, 100, 200, 300, 400]
6. 存储方式

PS: 以下示例使用的是 Python3.9版本

input:

test_list = [100, 200, 300]
print("初始化相同元素,列表所占用的大小为:{}".format(test_list.__sizeof__()))
test_tuple = (100, 200, 300)
print("初始化相同元素,元组所占用的大小为:{}".format(test_tuple.__sizeof__()))

output:

初始化相同元素,列表所占用的大小为:104
初始化相同元素,元组所占用的大小为:48

从输出结果可以看到,初始化相同元素,但是元组的存储空间,却比列表要少56字节,这是由于什么原因导致的呢?

1). 存储指针占用:8字节

因为列表是动态的,所以它需要存储指针,来指向对应的元素(上述例子中,对于int型,存储指针占用:8字节)

2). 分配8字节长度用于追踪列表空间使用情况

由于列表可变,所以需要额外存储已经分配的长度大小:8字节,用于实时追踪列表空间的使用情况,当空间不足时,及时分配额外空间

3). 预留3个元素的存储空间共24字节

因为列表是动态的,需要提前预留3个元素的存储空间,每个元素是8字节,可以大大节省频繁分配空间的开销

4). 空列表占用空间比空元组占用空间多16字节

空列表所占用的大小为:40字节,空元组所占用的大小为:24字节

所以,最终列表比元组多占用的 56字节 = 8字节 + 8字节 + 24字节 + 16字节

PS:

元组长度大小固定,元素不可变,所以存储空间固定,空元组占用24字节,在初始化3个元素时,每个元素占用8字节,最终共占用48字节。

从上面的示例可知,元组要比列表更加轻量级一些,所以总体上而言,元组的性能速度要略优于列表。

欢迎关注 无量测试之道 公众号,回复:领取资源

Python+Unittest框架API自动化、

Python+Unittest框架API自动化、

Python+Pytest框架API自动化、

Python+Pandas+Pyecharts大数据分析、

Python+Selenium框架Web的UI自动化、

Python+Appium框架APP的UI自动化、

Python编程学习资源干货、

Vue前端组件化框架开发、

资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。

备注:我的个人公众号已正式开通,致力于IT互联网技术的分享。

包含:数据分析、大数据、机器学习、测试开发、API接口自动化、测试运维、UI自动化、性能测试、代码检测、编程技术等。

微信搜索公众号:无量测试之道

添加关注,让我们一起共同成长!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入剖析 Python 最常用数据结构:列表(List) & 元组(Tuple) 的相关文章

随机推荐

  • 深入理解Vue双向数据绑定

    MVVM Vue的双向数据绑定是指model 模型 也就是vue实例中的数据 和view 视图 的双向绑定 即一个发生改变 另一个也会改变 首先了解一下什么是MVVM model view viewmodel 在 MVVM 架构中 引入了
  • selenium webdriver webelement获取标签方法

    1 等待浏览器加载完指定的标签 from selenium webdriver support wait import WebDriverWait from selenium webdriver support import expecte
  • 使用C++中用OLEDB读dbf文件,报“外部表不是预期的格式”错误的处理

    使用C builder的ADO控件访问dbf文件 执行SQL时报错 我的connect连接字符串 con1 gt ConnectionString Provider Microsoft Jet OLEDB 4 0 Data Source s
  • python 基于GPS空间相似度的K-means轨迹聚类

    python 基于空间相似度的K means轨迹聚类 数据读取 定义不同轨迹间的距离 计算距离矩阵 k means聚类 这里分享一些轨迹聚类的基本方法 涉及轨迹距离的定义 kmeans聚类应用 需要使用的python库如下 import p
  • Node事件循环

    node事件循环和浏览器事件循环完全不一样 Node事件循环阶段 timers 定时器 此阶段执行setTimeout和setInterval调度的回调函数 I O callback I O回调 此阶段执行几乎所有的回调函数 除了close
  • C语言---栈(详解)---数据结构

    如果要拿数据要先拿最上面的 不允许跳过第一个 拿第二个 先重定义类型 意义前几篇都要讲 就不再赘述 实现栈要用到的头文件 结构体 top是记录栈中现有多少个数据 并且top一直处于栈顶 capacity就是容量大小 如果大于容量大小 那么我
  • 企业电子招标采购系统源码Spring Cloud + Spring Boot + MybatisPlus + Redis + Layui + 前后端分离 + 二次开发

    功能描述 1 门户管理 所有用户可在门户页面查看所有的公告信息及相关的通知信息 主要板块包含 招标公告 非招标公告 系统通知 政策法规 2 立项管理 企业用户可对需要采购的项目进行立项申请 并提交审批 查看所有的立项信息 主要功能包含 招标
  • 最强自动化测试框架Playwright(34)CDPSession

    在 Playwright 中 CDPSession 类是用于与浏览器的 Chrome DevTools Protocol CDP 会话进行交互的对象 CDP 是与Chromium浏览器通信的底层协议 它提供了许多与浏览器进行交互和控制的功能
  • 电动机三相绕组的星形接线法和三角形接线法

    三相异步电动机的定子绕组由U V W三相绕组组成 这三相绕组有6个接线端 它们与接线盒的6个接线柱连接 在接线盒上 可以通过将不同的接线柱短接 来将三相异步电动机定子绕组接成星形或三角形 图1 三相异步电动机接线盒 1 星形接线法 要将定子
  • FutureTask源码解析(详细)

    FutureTask源码解析 详细 首先futuretask实现了Runablefuture接口 此接口声明了run方法 而Runablefuture接口继承了runable和future接口 future接口定义了某些方法比如get获取结
  • listener模式

    监听者模式 一个listenerCenter 每个listener 对不同的传入参数做不同的事情 把这些listener加入Center列表 然后Center执行做什么事情 调用响应的listener执行事情 我只需要让center 广播消
  • 『学Vue2+Vue3』生命周期、工程化开发入门、综合案例-小兔仙首页

    day03 一 今日目标 1 生命周期 生命周期介绍 生命周期的四个阶段 生命周期钩子 声明周期案例 2 综合案例 小黑记账清单 列表渲染 添加 删除 饼图渲染 3 工程化开发入门 工程化开发和脚手架 项目运行流程 组件化 组件注册 4 综
  • 蓝牙Mesh协议三 设备配网

    前言 蓝牙Mesh配网就是通过配网器配置未配网设备 将未配网设备加入网络中 使其成为蓝牙mesh网络的节点 配网数据中包括分发网络密钥 network key 元素单播地址 unicast address 和IV Index 为了提高配网效
  • nmap基础使用

    nmap Nmap包含四项基本功能 主机发现 Host Discovery 端口扫描 Port Scanning 版本侦测 Version Detection 操作系统侦测 Operating System Detection 而这四项功能
  • el-form表单中el-form-item嵌套表格嵌套表单校验

  • spss对数据进行聚类分析(系统聚类法和k-均值聚类法)和判别分析(费歇尔和贝叶斯)。

    为了方便大家理解 以三道题为例 实现聚类分析和判别分析的演示 1 为了研究世界各国森林 草原资源的分布规律 共抽取了21个国家的数据 每个国家4项指标 原始数据见下表 试用该原始数据对国别进行系统聚类和K 均值聚类 分3类 分析 国别 森林
  • 文章发布系统的设计与实现

    摘 要 随着计算机技术的迅速发展 网络正以一种前所未有的冲击力影响着人类的生产和生活 网络的快速发展 颠覆了传统的信息传播方式 冲破了传统的时间 空间的局限性 继而引发了人类阅读方式的变革 现如今 网络阅读已成为一种新的时尚 在这种趋势下
  • ESP8266 WIFI模块实现远程wifi控制

    http www geek workshop com thread 11266 1 1 html http bbs elecfans com forum php mod viewthread tid 536464 http www extr
  • Ubuntu18.04.6 配置固定ip、ssh登录、root账号

    上文讲解了如何下载安装ubuntu https blog csdn net weixin 47491957 article details 128839639 ubuntu在安装完成后 是不能进行ssh登录 且没有root账号 本文带来如何
  • 深入剖析 Python 最常用数据结构:列表(List) & 元组(Tuple)

    1 定义 列表和元组 都是一个可以放置任意数据类型的有序集合 在大多数编程语言中 集合内元素的数据类型必须保持一致 但在 Python 的列表与元组中 没有这个约束 示例 列表 List Tom 22 33 tony 元组 Tuple Ch