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

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

 [[387797]]

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

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

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

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

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

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

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

......(此处省略 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] 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

我们知道,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] 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

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

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

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

>>> stack 
[3,4,5] 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

这种情形下,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"
>>> queue 
deque(['Eric','John','Michael','Terry','Graham']) 
>>>  
>>> queue.popleft() 
'Eric' 
>>> queue.popleft() 
'John' 
>>> queue 
deque(['Michael','Terry','Graham']) 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

总结一下。

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

list 可用来实现栈操作。

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

本文转载自微信公众号「python学与思」,可以通过以下二维码关注。转载本文请联系python学与思公众号。

 

责任编辑:武晓燕 来源: python学与思
相关推荐

2024-12-31 07:56:33

Disruptor内存有界队列消费模式

2025-02-11 09:49:12

2020-11-20 10:53:46

边缘计算

2023-04-03 11:01:26

低代码平台场景

2022-10-17 00:27:20

二叉树数组索引

2023-01-30 11:27:57

人工智能高性能计算CPU

2023-11-28 08:20:25

2024-01-03 10:32:36

2022-07-24 21:56:38

元宇宙

2020-10-16 09:09:20

机器学习银行技术

2020-09-18 06:39:18

hashMap循环数据

2020-12-21 14:42:42

大数据云计算人工智能

2024-05-29 14:34:07

2017-11-01 10:31:08

Docker

2024-11-12 06:27:16

Python列表元组

2023-11-26 00:34:36

Javascript应用方法

2022-05-09 07:27:50

ThreadLocaJava

2018-03-27 09:10:54

区块链

2021-08-06 10:43:56

Kubernetes容器
点赞
收藏

51CTO技术栈公众号