Python 列表的应用场景有哪些?你使用对了吗?

我们在前几篇文章中依次介绍了列表的特性和用法列表推导式列表的底层实现。今天来聊一聊列表在实际开发中的应用场景。

在开发中,选用何种数据结构是由我们面对的数据特征和业务场景决定的。

数据是单个的还是批量的,是小规模的还是海量的?

数据是独立的还是彼此关联的?

数据的生成是随机的还是有先后顺序的?

数据的用途是什么?会不会频繁读写?只读多还是修改多?

数据是否应用于多线程环境?

......(此处省略 N 多情形。)

一旦确定了数据特征和业务场景,我们就可以从开发工具箱中选择合适的工具了。


对于 list 而言,首先它是一个对象集合,你可以在处理批量数据时使用 list。

>>> alist =[i for i inrange(21)]>>> alist[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]>>> alist.append(2021)>>> alist[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,2021]

我们知道,tuple 也可以用来存储多个对象,但是 tuple 是不可变的,一旦初始化,无法再增减其中的元素的个数。tuple 从语法上保证了元素数目不会被修改。

如果你恰好不希望别人向数据集中增删元素,你应该优先使用 tuple,而非list。反过来,如果你需要动态调整数据集合中的元素的个数,那就应该选择 list。


这是否意味着所有动态数据集都可以使用 list 呢?非也。

如果你的数据很少被修改,绝大部分时间都是被读取的,这很适合使用 list 来存储。因为 list 为我们提供了索引和切片操作,可以快速访问其中的元素。

>>> alist[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,2021]>>> alist[10]10>>> alist[3:9][3,4,5,6,7,8]>>> alist[3:9:2][3,5,7]

如果你仅仅使用 append() 在 list 尾部追加元素,或者删除 list 尾部元素,那也可以放心使用 list。因为,在列表末尾添加和删除元素非常快。

>>> stack =[3,4,5]>>> stack.append(6)>>> stack.append(7)>>> stack[3,4,5,6,7]>>> stack.pop()7>>> stack[3,4,5,6]>>> stack.pop()6>>> stack[3,4,5]

这种情形下,list 其实就用作栈(stack)了。


但是,如果你的程序需要频繁在 list 头部或中间插入或删除元素,list 就不太适合你的需求了。

因为,list 底层是通过变长数组实现的。在数组头部或中间插入或删除元素,需要逐个移动插入位置之后的每个元素。这在数据量大时会消耗大量时间,效率低下。

而在常见的业务场景中,频繁增删中间元素的操作多见于链式存储结构(如链表),在线性存储结构(如数组)中并不多见。

如果想在 Python 中使用链式结构,可以使用 collections.deque。严格来说,collections.deque 也不是一个完全的链式结构,它是一个带有块(block)数据的链式结构。每个 block 都是一个线性数组。

我们来看一个需要频繁在数据集的首尾执行操作的场景:队列(queue)。

队列是一个先进先出(FIFO)的数据结构,数据从尾部插入,从头部取出。就好像我们日常排队一样。

由于需要频繁删除头部元素,list 也不适合用作队列。很多初学者仅从list 这个单词的字面意思来理解,就把 list 作为队列来使用,这是欠妥的。

我们可以用 collections.deque 来实现队列操作。

>>>from collections import deque>>> queue = deque(["Eric","John","Michael"])>>> queue.append("Terry")>>> queue.append("Graham")>>> queuedeque(['Eric','John','Michael','Terry','Graham'])>>> >>> queue.popleft()'Eric'>>> queue.popleft()'John'>>> queuedeque(['Michael','Terry','Graham'])

总结一下。

list 适用于处理动态数据集,特别适合用于读操作远多于写操作的场景。

list 可用来实现栈操作。

List 不适合用作队列,可使用 collections.deque 来实现队列操作。


【相关文章】

  1. Python 中的列表和元组

  2. 列表推导式:简洁高效更具 Python 风格的列表创建方法

  3. 从 Python 列表的特性探究其底层实现机制

(0)

相关推荐

  • 这8种数据结构,身为python开发的你必须得懂

    在解决现实世界的编码问题时,雇主和招聘人员都在寻找运行时和资源效率. 知道哪个数据结构最适合当前的解决方案将提高程序的性能,并减少开发所需的时间.出于这个原因,大多数顶级公司都要求对数据结构有很深的理 ...

  • 数据结构:队列与堆栈

    队列与堆栈都是一种数据的存储方式. 队列可以提供先进先出的顺序(FIFO).它每一次移除的元素,都是你最先放进去的元素.这里有一个非常类似的数据结构,堆栈Stack,属于后进先出的顺序(LIFO,La ...

  • Python列表与元组有什么相同点?基础分享!

    无论从事Python相关工作还是刚刚学习Python,想必大家都听说过Python列表和元祖吧,而且经常有人将他们混为一谈,那么你知道Python列表和元组有什么相同点和不同点吗?我们通过这篇文章来看 ...

  • Python列表与元组有什么作用?入门分享!

    Python数据类型分为七大类,其中最为常见的就是列表和字典,是使用Python必须掌握的基础.那么Python列表和字典有什么不同之处?我们一起来看看吧. 列表 1. 任意对象的有序集合,列表是一组 ...

  • 什么是Python列表?与元组有何区别?

    Python中,有三种内建的数据结构,列表.元组和字典,那么它们之间有什么区别呢?我们通过这篇文章来看看吧. 什么是Python列表? 列表是由一系列按特定顺序排列的元组组成的.在Python中,用[ ...

  • python列表

    列表list是python中最常用的数据类型,其类似于其他语言中的数组,但也有不同,主要的区别在于list中的元素可以是不同的数据类型. 1.列表的创建 创建一个列表,只要用方括号把数据项括起来即可. ...

  • 4.Python列表/元组/集合/字典

    碧茂大数据 前天 4.1 Python列表 · 列表用 [ ] 标识,是Python 最通用的复合数据类型. · 列表用 [ ] 表示,列表具有可嵌套性 4.1.1 Python列表截取 · 列表可以 ...

  • 像这样操作 Python 列表,能让你的代码更优雅

    写 Python 代码,列表的出镜率是相当高的,伴随列表一起出现的往往就是一大堆 for 循环,这样的代码多了看起来非常不简洁.作为一名 Python 程序员,怎么能忍受呢? 那有没有什么好办法呢?除 ...

  • 从 Python 列表的特性来探究其底层实现机制

    " list 之所以好用归功于底层巧妙的设计" 列表(list)是 Python 中一个非常重要且常见的数据结构,它有很多易用的特性:可索引([index]),可切片([start ...

  • Python数组和Python列表的区别!

    众所周知,Python数据类型分为很多种,其中包括元组.字典.列表等.今天这篇文章主要为大家介绍一下Python数组和Python列表的区别,希望对你们有所帮助. Python中的list是Pytho ...

  • Python 列表(List) | 菜鸟教程

    Python 列表(List) 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型 ...