自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python 列表的應(yīng)用場(chǎng)景有哪些?你使用對(duì)了嗎?

開(kāi)發(fā) 后端
我們?cè)谇皫灼恼轮幸来谓榻B了列表的特性和用法、列表推導(dǎo)式、列表的底層實(shí)現(xiàn)。今天來(lái)聊一聊列表在實(shí)際開(kāi)發(fā)中的應(yīng)用場(chǎng)景。

 [[387797]]

我們?cè)谇皫灼恼轮幸来谓榻B了列表的特性和用法、列表推導(dǎo)式、列表的底層實(shí)現(xiàn)。今天來(lái)聊一聊列表在實(shí)際開(kāi)發(fā)中的應(yīng)用場(chǎng)景。

在開(kāi)發(fā)中,選用何種數(shù)據(jù)結(jié)構(gòu)是由我們面對(duì)的數(shù)據(jù)特征和業(yè)務(wù)場(chǎng)景決定的。

數(shù)據(jù)是單個(gè)的還是批量的,是小規(guī)模的還是海量的?

數(shù)據(jù)是獨(dú)立的還是彼此關(guān)聯(lián)的?

數(shù)據(jù)的生成是隨機(jī)的還是有先后順序的?

數(shù)據(jù)的用途是什么?會(huì)不會(huì)頻繁讀寫(xiě)?只讀多還是修改多?

數(shù)據(jù)是否應(yīng)用于多線程環(huán)境?

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

一旦確定了數(shù)據(jù)特征和業(yè)務(wù)場(chǎng)景,我們就可以從開(kāi)發(fā)工具箱中選擇合適的工具了。

對(duì)于 list 而言,首先它是一個(gè)對(duì)象集合,你可以在處理批量數(shù)據(jù)時(shí)使用 list。

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

我們知道,tuple 也可以用來(lái)存儲(chǔ)多個(gè)對(duì)象,但是 tuple 是不可變的,一旦初始化,無(wú)法再增減其中的元素的個(gè)數(shù)。tuple 從語(yǔ)法上保證了元素?cái)?shù)目不會(huì)被修改。

如果你恰好不希望別人向數(shù)據(jù)集中增刪元素,你應(yīng)該優(yōu)先使用 tuple,而非list。反過(guò)來(lái),如果你需要?jiǎng)討B(tài)調(diào)整數(shù)據(jù)集合中的元素的個(gè)數(shù),那就應(yīng)該選擇 list。

這是否意味著所有動(dòng)態(tài)數(shù)據(jù)集都可以使用 list 呢?非也。

如果你的數(shù)據(jù)很少被修改,絕大部分時(shí)間都是被讀取的,這很適合使用 list 來(lái)存儲(chǔ)。因?yàn)?list 為我們提供了索引和切片操作,可以快速訪問(wèn)其中的元素。

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

如果你僅僅使用 append() 在 list 尾部追加元素,或者刪除 list 尾部元素,那也可以放心使用 list。因?yàn)椋诹斜砟┪蔡砑雍蛣h除元素非???。

  1. >>> stack =[3,4,5] 
  2. >>> stack.append(6) 
  3. >>> stack.append(7) 
  4. >>> stack 
  5. [3,4,5,6,7] 
  6. >>> stack.pop() 
  7. >>> stack 
  8. [3,4,5,6] 
  9. >>> stack.pop() 
  10. >>> stack 
  11. [3,4,5] 

這種情形下,list 其實(shí)就用作棧(stack)了。

但是,如果你的程序需要頻繁在 list 頭部或中間插入或刪除元素,list 就不太適合你的需求了。

因?yàn)?,list 底層是通過(guò)變長(zhǎng)數(shù)組實(shí)現(xiàn)的。在數(shù)組頭部或中間插入或刪除元素,需要逐個(gè)移動(dòng)插入位置之后的每個(gè)元素。這在數(shù)據(jù)量大時(shí)會(huì)消耗大量時(shí)間,效率低下。

而在常見(jiàn)的業(yè)務(wù)場(chǎng)景中,頻繁增刪中間元素的操作多見(jiàn)于鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)(如鏈表),在線性存儲(chǔ)結(jié)構(gòu)(如數(shù)組)中并不多見(jiàn)。

如果想在 Python 中使用鏈?zhǔn)浇Y(jié)構(gòu),可以使用 collections.deque。嚴(yán)格來(lái)說(shuō),collections.deque 也不是一個(gè)完全的鏈?zhǔn)浇Y(jié)構(gòu),它是一個(gè)帶有塊(block)數(shù)據(jù)的鏈?zhǔn)浇Y(jié)構(gòu)。每個(gè) block 都是一個(gè)線性數(shù)組。

我們來(lái)看一個(gè)需要頻繁在數(shù)據(jù)集的首尾執(zhí)行操作的場(chǎng)景:隊(duì)列(queue)。

隊(duì)列是一個(gè)先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)從尾部插入,從頭部取出。就好像我們?nèi)粘E抨?duì)一樣。

由于需要頻繁刪除頭部元素,list 也不適合用作隊(duì)列。很多初學(xué)者僅從list 這個(gè)單詞的字面意思來(lái)理解,就把 list 作為隊(duì)列來(lái)使用,這是欠妥的。

我們可以用 collections.deque 來(lái)實(shí)現(xiàn)隊(duì)列操作。

  1. >>>from collections import deque 
  2. >>> queue = deque(["Eric","John","Michael"]) 
  3. >>> queue.append("Terry"
  4. >>> queue.append("Graham"
  5. >>> queue 
  6. deque(['Eric','John','Michael','Terry','Graham']) 
  7. >>>  
  8. >>> queue.popleft() 
  9. 'Eric' 
  10. >>> queue.popleft() 
  11. 'John' 
  12. >>> queue 
  13. deque(['Michael','Terry','Graham']) 

總結(jié)一下。

list 適用于處理動(dòng)態(tài)數(shù)據(jù)集,特別適合用于讀操作遠(yuǎn)多于寫(xiě)操作的場(chǎng)景。

list 可用來(lái)實(shí)現(xiàn)棧操作。

List 不適合用作隊(duì)列,可使用 collections.deque 來(lái)實(shí)現(xiàn)隊(duì)列操作。

本文轉(zhuǎn)載自微信公眾號(hào)「python學(xué)與思」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系python學(xué)與思公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: python學(xué)與思
相關(guān)推薦

2024-12-31 07:56:33

Disruptor內(nèi)存有界隊(duì)列消費(fèi)模式

2025-02-11 09:49:12

2020-11-20 10:53:46

邊緣計(jì)算

2023-04-03 11:01:26

低代碼平臺(tái)場(chǎng)景

2022-10-17 00:27:20

二叉樹(shù)數(shù)組索引

2023-01-30 11:27:57

人工智能高性能計(jì)算CPU

2024-01-03 10:32:36

2020-10-16 09:09:20

機(jī)器學(xué)習(xí)銀行技術(shù)

2022-07-24 21:56:38

元宇宙

2023-11-28 08:20:25

2020-09-18 06:39:18

hashMap循環(huán)數(shù)據(jù)

2020-12-21 14:42:42

大數(shù)據(jù)云計(jì)算人工智能

2024-05-29 14:34:07

2024-11-12 06:27:16

Python列表元組

2017-11-01 10:31:08

Docker

2018-03-27 09:10:54

區(qū)塊鏈

2023-11-26 00:34:36

Javascript應(yīng)用方法

2022-05-09 07:27:50

ThreadLocaJava

2021-08-06 10:43:56

Kubernetes容器

2021-03-15 13:36:23

區(qū)塊鏈大數(shù)據(jù)技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)