pyhton的内置类型(2)----列表和元组

2024-02-09 01:18

本文主要是介绍pyhton的内置类型(2)----列表和元组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 1. 列表和元组的区别
          • 1. 相同点
          • 2. 不同点
      • 2.列表常用的内置函数
      • 3.元组常用的内置函数
      • 4. 列表和元组的不同的存储方式
          • 1. 对列表和元组,我们放置了相同的元素,但是元组的存储空间,却比列表要少16字节。这是为什么呢?
          • 2. 列表空间分配的过程
      • 5. 列表和元组的性能
      • 6. 列表和元组的初始化方式

1. 列表和元组的区别

1. 相同点
  • 列表和元组,都是一个可以放置任意数据类型的有序集合
    在绝大多数编程语言中,集合的数据类型必须一致。不过,对于Python的列表和元组来说,并无此要求.

    list_test = [6, 2, 'hello', 'world']  # 列表中同时含有int和string类型的元素
    [6, 2, 'hello', 'world']
    tuple_test = ('jason', 22) # 元组中同时含有int和string类型的元素
    tup('jason', 22)
    
  • Python中的列表和元组都支持负数索引 -1表示最后一个元素,-2表示倒数第二个元素,以此类推。

  • 列表和元组都支持切片操作

  • 列表和元组都可以随意嵌套

  • 两者也可以通过list()和tuple()函数相互转换

2. 不同点
  • 列表是动态的,长度大小不固定,可以随意地增加、删减或者改变元素(mutable)。列表的存储空间略大于元组,性能略逊于元组
  • 而元组是静态的,长度大小固定,无法增加删减或者改变(immutable)。元组相对于列表更加轻量级,性能稍优.

2.列表常用的内置函数

方法意义
L.index(v [, begin[, end]])返回对应元素的索引下标, begin为开始索引,end为结束索引,当 value 不存在时触发ValueError错误
L.insert(index, obj)将某个元素插放到列表中指定的位置
L.count(x)返回列表中元素的个数
L.remove(x)从列表中删除第一次出现在列表中的值
L.copy()复制此列表(只复制一层,不会复制深层对象)
L.append(x)向列表中追加单个元素
L.extend(lst)向列表追加另一个列表
L.clear()清空列表,等同于 L[:] = []
L.sort(reverse=False)将列表中的元素进行排序,默认顺序按值的小到大的顺序排列
L.reverse()列表的反转,用来改变原列表的先后顺序
L.pop([index])删除索引对应的元素,如果不加索引,默认删除最后元素,同时返回删除元素的引用关系

3.元组常用的内置函数

方法说明
T.index(v [, begin[, end]])返回对应元素的索引下标, begin为开始索引,end为结束索引,当 value 不存在时触发ValueError错误
T.count(x)返回元组中对应元素的个数

list.reverse()和list.sort()分别表示原地倒转列表和排序(注意,元组没有内置的这两个函数)。
reversed()和sorted()同样表示对列表/元组进行倒转和排序,但是会返回一个倒转后或者排好序的新的列表/元组

4. 列表和元组的不同的存储方式

l = [1, 2, 3]
l.__sizeof__() # 64
tup = (1, 2, 3)
tup.__sizeof__()  # 48
1. 对列表和元组,我们放置了相同的元素,但是元组的存储空间,却比列表要少16字节。这是为什么呢?
  1. 由于列表是动态的,所以它需要存储指针,来指向对应的元素(上述例子中,对于int型,8字节)。
  2. 由于列表可变,所以需要额外存储已经分配的长度大小(8字节),这样才可以实时追踪列表空间的使用情况,当空间不足时,及时分配额外空间。
2. 列表空间分配的过程
l = []
l.__sizeof__() // 空列表的存储空间为40字节40
l.append(1)
l.__sizeof__()72 // 加入了元素1之后,列表为其分配了可以存储4个元素的空间 (72 - 40)/8 = 4
l.append(2)
l.__sizeof__()72 // 由于之前分配了空间,所以加入元素2,列表空间不变
l.append(3)
l.__sizeof__()72 // 同上
l.append(4)
l.__sizeof__()72 // 同上
l.append(5)
l.__sizeof__()104 // 加入元素5之后,列表的空间不足,所以又额外分配了可以存储4个元素的空间
  • 上面的例子,大概描述了列表空间分配的过程
    我们可以看到,为了减小每次增加/删减操作时空间分配的开销,Python每次分配空间时都会额外多分配一些,这样的机制(over-allocating)保证了其操作的高效性:增加/删除的时间复杂度均为O(1)

  • 对于元组,情况就不同了。元组长度大小固定,元素不可变,所以存储空间固定

5. 列表和元组的性能

  • 初始化一个相同元素的列表和元组分别所需的时间。元组的初始化速度,要比列表快5倍左右。
  • 索引操作,两者的速度差别非常小,几乎可以忽略不计
  • 增加、删减或者改变元素,那么列表显然更优

6. 列表和元组的初始化方式

python3 -m timeit 'empty_list = list()'
10000000 loops, best of 3: 0.094 usec per loop
python3 -m timeit 'empty_list = []'
10000000 loops, best of 3: 0.0246 usec per loop
python3 -m timeit 'empty_list = ()'
100000000 loops, best of 3: 0.0152 usec per loop
python3 -m timeit 'empty_list = tuple()'
10000000 loops, best of 3: 0.0798 usec per loop

由此可见,初始化列表和元组的时候,我们应尽量使用[]和()
原因:
list()是一个function call,Python的function call会创建stack,并且进行一系列参数检查的操作,比较expensive,反观[]是一个内置的C函数,可以直接被调用,因此效率高

  • 性能和存储方式参考自极客时间景霄老师的python核心技术与实战

这篇关于pyhton的内置类型(2)----列表和元组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/692750

相关文章

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

Python实现将实体类列表数据导出到Excel文件

《Python实现将实体类列表数据导出到Excel文件》在数据处理和报告生成中,将实体类的列表数据导出到Excel文件是一项常见任务,Python提供了多种库来实现这一目标,下面就来跟随小编一起学习一... 目录一、环境准备二、定义实体类三、创建实体类列表四、将实体类列表转换为DataFrame五、导出Da

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景

C# dynamic类型使用详解

《C#dynamic类型使用详解》C#中的dynamic类型允许在运行时确定对象的类型和成员,跳过编译时类型检查,适用于处理未知类型的对象或与动态语言互操作,dynamic支持动态成员解析、添加和删... 目录简介dynamic 的定义dynamic 的使用动态类型赋值访问成员动态方法调用dynamic 的

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给