在之前的文章中,我们依次介绍了列表的特点和用法、列表理解、列表的底层实现。今天我们就来说说列表在实际开发中的应用场景。在开发中,选择哪种数据结构是由我们所面对的数据特性和业务场景决定的。数据是单一的还是批量的,小规模的还是海量的?数据是独立的还是相互关联的?数据是随机生成的还是顺序生成的?数据的目的是什么?会不会经常读写?更多只读还是更多修改?数据应用在多线程环境下吗?……(这里省略了N多case。)确定了数据特征和业务场景后,我们也可以从开发工具箱工具中选择合适的.对于list,首先它是一个对象的集合,在处理批量数据的时候可以使用list。>>>alist=[iforiinrange(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]我们知道元组也可以用来存储多个对象,但是元组是不可变的,一旦初始化,其中的元素个数就不能增加或减少。元组在语法上保证元素的数量不会被修改。如果你只是不想让其他人向数据集中添加或删除元素,你应该优先使用元组而不是列表。反之,如果需要动态调整数据集中的元素个数,就应该选择list。这是否意味着所有动态数据集都可以使用列表?没有。如果你的数据很少被修改,大部分时间都是读取,那么用list来存储是很合适的。因为list为我们提供了索引和切片操作,所以我们可以快速访问其中的元素。>>>阿里斯特[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()在列表末尾追加元素,或者删除列表末尾的元素,才可以放心使用列表。因为,在列表末尾添加和删除元素非常快。>>>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底层是用变长数组实现的。要在数组的头部或中间插入或删除元素,需要将插入位置之后的每个元素逐一移动。这会消耗大量时间,并且在数据量很大时效率低下。在常见的业务场景中,频繁增删中间元素的操作在链式存储结构(如链表)中比较常见,而在线性存储结构(如数组)中则很少见。如果你想在Python中使用链式结构,你可以使用collections.deque。严格来说,collections.deque并不是一个完整的链式结构,它是一个带有块(block)数据的链式结构。每个块都是一个线性阵列。我们来看一个需要对数据集首尾进行频繁操作的场景:队列。队列是一种先进先出(FIFO)数据结构,其中数据从尾部插入并从头部移除。就像我们每天排队一样。由于经常删除头部元素,列表也不适合用作队列。很多初学者只理解list这个词的字面意思,把list当作queue来用,这是不合适的。我们可以使用collections.deque来实现队列操作。>>>fromcollectionsimportdeque>>>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来实现队列操作。本文转载自微信公众号《Python学习与思考》,可通过以下二维码关注。转载本文请联系python学习与思考公众号。
