iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python列表的数据结构是怎么样的
  • 660
分享到

Python列表的数据结构是怎么样的

2023-06-08 01:06:57 660人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章给大家分享的是有关python列表的数据结构是怎么样的的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Python 列表的数据结构是怎么样的?列表实际上采用的就是数据结构中的顺序表,而且是一种采用分离式技术

这篇文章给大家分享的是有关python列表的数据结构是怎么样的的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

Python 列表的数据结构是怎么样的?

列表实际上采用的就是数据结构中的顺序表,而且是一种采用分离式技术实现的动态顺序表

但这是不是Python的列表?

我的结论是顺序表是列表的一种实现方式。

书上说的是:列表实现可以是数组链表

顺序表是怎么回事?顺序表一般是数组。

列表是一个线性的集合,它允许用户在任何位置插入、删除、访问和替换元素。

列表实现是基于数组或基于链表结构的。当使用列表迭代器的时候,双链表结构比单链表结构更快。

有序的列表是元素总是按照升序或者降序排列的元素。

实现细节

python中的列表的英文名是list,因此很容易和其它语言(c++, Java等)标准库中常见的链表混淆。事实上CPython的列表根本不是列表(可能换成英文理解起来容易些:python中的list不是list)。在CPython中,列表被实现为长度可变的数组。

可参考《Python高级编程(第2版)》

从细节上看,Python中的列表是由对其它对象的引用组成的连续数组。指向这个数组的指针及其长度被保存在一个列表头结构中。

这意味着,每次添加或删除一个元素时,由引用组成的数组需要该标大小(重新分配)。

幸运的是,Python在创建这些数组时采用了指数分配,所以并不是每次操作都需要改变数组的大小。但是,也因为这个原因添加或取出元素的平摊复杂度较低。

不幸的是,在普通链表上“代价很小”的其它一些操作在Python中计算复杂度相对过高。

利用 list.insert(i,item) 方法在任意位置插入一个元素——复杂度O(N)

利用 list.pop(i) 或 list.remove(value) 删除一个元素——复杂度O(N)

列表的算法效率

可以采用时间复杂度来衡量:

index() O(1)

append O(1)

pop() O(1)

pop(i) O(n)

insert(i,item) O(n)

del operator O(n)

iteration O(n)

contains(in) O(n)

get slice[x:y] O(k)

del slice O(n)

set slice O(n+k)

reverse O(n)

concatenate O(k)

sort O(nlogn)

multiply O(nk)

O括号里面的值越大代表效率越低

列表和元组

列表和元组的区别是显然的:

列表是动态的,其大小可以该标 (重新分配);

而元组是不可变的,一旦创建就不能修改。

list和tuple在c实现上是很相似的,对于元素数量大的时候,

都是一个数组指针,指针指向相应的对象,找不到tuple比list快的理由。

但对于小对象来说,tuple会有一个对象池,所以小的、重复的使用tuple还有益处的。

为什么要有tuple,还有很多的合理性。

实际情况中的确也有不少大小固定的列表结构,例如二维地理坐标等;

另外tuple也给元素天然地赋予了只读属性。

认为tuple比list快的人大概是把python的tuple和list类比成C++中的数组和列表了。

补充:python list, tuple, dictionary, set的底层细节

list, tuple, dictionary, set是python中4中常见的集合类型。在笔者之前的学习中,只是简单了学习它们4者的使用,现记录一下更深底层的知识。

列表和元组

列表和元组的区别是显然的:列表是动态的,其大小可以该标;而元组是不可变的,一旦创建就不能修改。

实现细节

python中的列表的英文名是list,因此很容易和其它语言(C++, Java等)标准库中常见的链表混淆。事实上CPython的列表根本不是列表(可能换成英文理解起来容易些:python中的list不是list)。在CPython中,列表被实现为长度可变的数组。

从细节上看,Python中的列表是由对其它对象的引用组成的连续数组。指向这个数组的指针及其长度被保存在一个列表头结构中。这意味着,每次添加或删除一个元素时,由引用组成的数组需要该标大小(重新分配)。幸运的是,Python在创建这些数组时采用了指数过分配,所以并不是每次操作都需要改变数组的大小。但是,也因为这个原因添加或取出元素的平摊复杂度较低。

不幸的是,在普通链表上“代价很小”的其它一些操作在Python中计算复杂度相对过高。

利用 list.insert方法在任意位置插入一个元素——复杂度O(N)

利用 list.delete或del删除一个元素——复杂度O(N)

操作复杂度
复制O(N)
添加元素(在尾部添加)O(1)
插入元素(在指定位置插入)O(N)
获取元素O(1)
修改元素O(1)
删除元素O(N)
遍历O(N)
获取长度为k的切片O(k)
删除切片O(N)
列表扩展O(k)
测试是否在列表中O(N)
min()/max()O(n)
获取列表长度O(1)

列表推导

要习惯用列表推导,因为这更加高效和简短,涉及的语法元素少。在大型的程序中,这意味着更少的错误,代码也更容易阅读。

>>>[i for i in range(10) if i % 2 == 0] [0, 2, 4, 6, 8]

其它习语

使用enumerate.在循环使用序列时,这个内置函数可以方便的获取其索引

for i, element in enumerate(['one', 'two', 'three']): print(i, element)

result:

0 one1 two2 three

如果需要一个一个合并多个列表中的元素,可以使用zip()。对两个大小相等的可迭代对象进行均匀遍历时,这是一个非常常用的模式:

for item in zip([1, 2, 3], [4, 5, 6]): print(item)
(1, 4)(2, 5)(3, 6)

序列解包

#带星号的表达式可以获取序列的剩余部分>>>first, second, *reset = 0, 1, 2, 3>>>first0>>>second1>>>reset[2, 3]

字典

字典是python中最通用的数据结构之一。dict可以将一组唯一的键映射到相应的值。

我们也可以用前面列表推导的方式来创建一个字典。

squares = {number: number**2 for number in range(10)}print(squares)

result:

{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

在遍历字典元素时,有一点需要特别注意。字典里的keys(), values()和items()3个方法的返回值不再是列表,而是视图对象(view objects)。

keys(): 返回dict_keys对象,可以查看字典所有键

values():返回dict_values对象,可以查看字典的所有值

items():返回dict_items对象,可以查看字典所有的{key, value}二元元组。

视图对象可以动态查看字典的内容,因此每次字典发生变化的时候,视图都会相应的改变,见下面这个例子:

Words = {'foo': 'bar', 'fizz': 'bazz'}items= words.items()words['spam'] = 'eggs'print(items)

result:

dict_items([('foo', 'bar'), ('fizz', 'bazz'), ('spam', 'eggs')])

视图无需冗余的将所有值都保存在内存中,像列表那样。但你仍然可以获取其长度(使用len),也可以测试元素是否包含在其中(使用in子句)。当然,视图是迭代的。

实现细节

CPython使用伪随机探测(pseudo-random probing)的散列表(hash table)作为字典的底层数据结构。由于这个实现细节,只有可哈希的对象才能作为字典的键。

Python中所有不可变的内置类型都是可哈希的。可变类型(如列表,字典和集合)就是不可哈希的,因此不能作为字典的键。

字典的三个基本操作(添加元素,获取元素和删除元素)的平均事件复杂度为O(1),但是他们的平摊最坏情况复杂度要高得多,为O(N).

操作平均复杂度平摊最坏情况复杂度
获取元素O(1)O(n)
修改元素O(1)O(n)
删除元素O(1)O(n)
复制O(n)O(n)
遍历O(n)O(n)

还有一点很重要,在复制和遍历字典的操作中,最坏的复杂度中的n是字典曾经达到的最大元素数目,而不是当前的元素数目。换句话说,如果一个字典曾经元素个数很多,后来又大大减小了,那么遍历这个字典可能会花费相当长的事件。

因此在某些情况下,如果需要频繁的遍历某个词典,那么最好创建一个新的字典对象,而不是仅在旧字典中删除元素。

字典的缺点和替代方案

使用字典的常见陷阱就是,它并不会按照键的添加顺序来保存元素的顺序。在某些情况下,字典的键是连续的,对应的散列值也是连续值(例如整数),那么由于字典的内部实现,元素的实现可能和添加的顺序相同:

keys = {num: None for num in range(5)}.keys()print(keys)

result:

dict_keys([0, 1, 2, 3, 4])

但是,如果散列方法不同的其它数据类型,那么字典就不会保存元素顺序。

age = {str(i): i for i in range(100)}keys = age.keys()print(keys)

result:

dict_keys(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99'])

理论上,键的顺序不应该是这样的,应该是乱序。。。具体为什么这样,等以后明白了再补充

如果我们需要保存添加顺序怎么办?python 标准库的collections模块提供了名为OrderedDicr的有序字典。

集合

集合是一种鲁棒性很好的数据结构,当元素顺序的重要性不如元素的唯一性和测试元素是否包含在集合中的效率时,大部分情况下这种数据结构极其有用。

python的内置集合类型有两种:

set(): 一种可变的、无序的、有限的集合,其元素是唯一的、不可变的(可哈希的)对象。

frozenset(): 一种不可变的、可哈希的、无序的集合,其元素是唯一的,不可变的哈希对象。

set([set([1, 2, 3]), set([2, 3, 4])])

result:

Traceback (most recent call last): File "/PyCharm_project/LearnPython/Part1/demo.py", line 1, in <module> set([set([1, 2, 3]), set([2, 3, 4])])TypeError: unhashable type: 'set'
set([frozenset([1, 2, 3]), frozenset([2, 3, 4])])

result:不会报错

set里的元素必须是唯一的,不可变的。但是set是可变的,所以set作为set的元素会报错。

实现细节

CPython中集合和字典非常相似。事实上,集合被实现为带有空值的字典,只有键才是实际的集合元素。此外,集合还利用这种没有值的映射做了其它的优化

由于这一点,可以快速的向集合中添加元素、删除元素、检查元素是否存在。平均时间复杂度为O(1),最坏的事件复杂度是O(n)。

感谢各位的阅读!关于“Python列表的数据结构是怎么样的”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: Python列表的数据结构是怎么样的

本文链接: https://www.lsjlt.com/news/250609.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python数据结构列表是怎样的
    Python数据结构列表是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。正则小练习:匹配出以下字符串所有url,import re d...
    99+
    2023-06-22
  • Python列表的数据结构是怎么样的
    这篇文章给大家分享的是有关Python列表的数据结构是怎么样的的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Python 列表的数据结构是怎么样的?列表实际上采用的就是数据结构中的顺序表,而且是一种采用分离式技术...
    99+
    2023-06-08
  • Python数据结构列表
    目录1 序列2 列表2.1 列表函数2.2 列表排序2.3 解析列表正则小练习:匹配出以下字符串所有url, import re def find_url(sentence, ...
    99+
    2022-11-12
  • python中pandas数据结构是怎么样的
    这篇文章给大家分享的是有关python中pandas数据结构是怎么样的的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、Series是一个类似于一维数组的对象,由一组数据(各种NumPy数据类型)和一组相关数据标...
    99+
    2023-06-20
  • web开发中数据结构线性结构链表是怎样的
    这篇文章给大家介绍web开发中数据结构线性结构链表是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、前言我们今天要讲解的 链表 不一样,链表是我们数据结构学习的一个重点,也有可...
    99+
    2022-10-19
  • julia数据结构是怎样的
    Julia是一种高性能的动态编程语言,具有灵活的数据结构和类型系统。它提供了许多内置的数据结构,同时也支持用户定义的自定义数据结构。...
    99+
    2023-09-21
    julia
  • Redis数据结构是怎样的
    这篇文章主要介绍“Redis数据结构是怎样的”,在日常操作中,相信很多人在Redis数据结构是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis数据结构是怎样的”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-27
  • Python内置数据结构——列表list
    内置数据结构分类:数值型int , float , complex , bool序列对象字符串 str列表 listtuple(元组)键值对集合 set字典 dict数字型int ,float , complex , bool都是class...
    99+
    2023-01-31
    数据结构 列表 Python
  • Python基础中os和数据结构是怎么样的
    Python基础中os和数据结构是怎么样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。今天总结了下Python的基础,发现还是有很多基础需要巩固,直接把学习的...
    99+
    2023-06-04
  • mysql数据目录结构是怎么样的
    mysql数据目录结构是怎么样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 mysql数据目...
    99+
    2022-10-19
  • JavaScript中Map数据结构是怎么样的
    这篇“JavaScript中Map数据结构是怎么样的”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“JavaScript中Map数据结构是怎么样的”,小编整理了以下知识点,请大家跟着小编的步伐一...
    99+
    2023-06-28
  • Python学习之day3数据结构之列表
                                                          数据结构之列表一、列表定义      列表是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目。列表中的项目应包括在...
    99+
    2023-01-31
    数据结构 列表 Python
  • PostgreSQL中的Tuplesortstate数据结构是怎样的
    本篇内容主要讲解“PostgreSQL中的Tuplesortstate数据结构是怎样的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PostgreSQL中的Tu...
    99+
    2022-10-18
  • JavaScript数据结构之散列表怎么创建
    本文小编为大家详细介绍“JavaScript数据结构之散列表怎么创建”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript数据结构之散列表怎么创建”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、处...
    99+
    2023-06-30
  • Python中选择结构是怎么样的
    这篇文章主要介绍了Python中选择结构是怎么样的,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。选择结构通过判断条件是否成立来决定分支的执行。选择结构形式:单分支、双分支、多...
    99+
    2023-06-25
  • Python数据结构之列表与元组详解
    目录Python 列表(list):1.序列介绍:2.列表的概述:3.创建一个列表4.列表的索引5.列表的分片6.列表的分片赋值7.循环遍历列表8.查找元素与计数9.列表增加元素:1...
    99+
    2022-11-12
  • python学习3-内置数据结构1-列表
    列表及常用操作    列表是一个序列,用于顺序的存储数据1、定义与初始化lst = list() #使用list函数定义空列表lst = []    #使用中括号定义列表lst = [1,2,3]    #使用中括号定义初始值列表lst =...
    99+
    2023-01-31
    数据结构 列表 python
  • LevelDB数据文件SSTable结构是怎样的
    这篇“LevelDB数据文件SSTable结构是怎样的”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来...
    99+
    2022-10-19
  • C语言数据结构中链队列的基本操作是怎样的
    这篇文章将为大家详细讲解有关C语言数据结构中链队列的基本操作是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.队列的定义队列 (Queue)是另一种限定性的线性表,它只允许在表的一端...
    99+
    2023-06-22
  • 举例讲解Python中的list列表数据结构用法
    循环和列表 不管怎样,程序会做一些重复的事情,下面我们就用for循环打印一个列表变量。做这个练习的时候你必须自己弄懂它们的含义和作用。 在使用for循环之前,我们需要一个东西保存循环的值,最好的方法是使用一...
    99+
    2022-06-04
    数据结构 列表 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作