1. 程式人生 > >python list/tuple/dict/set/deque的簡單比較、優化和時間複雜度

python list/tuple/dict/set/deque的簡單比較、優化和時間複雜度

一、關於增刪改查

序列listtupledictsetdeque
能否增加元素×
是否有序××
能否刪除×
可否雜湊××
序列listtupledictsetdeque
增加方法append、extend、insert×updateadd、updateappend/appendleft、extend/extendleft
刪除方法pop、remove× (tuple只有count和index兩個方法)pop、clear(這兩個是方法)/del(函式) del dict/dict[key]pop、remove和list類似,但多一個popleft(它和其他的區別在於雙端,append/extend/pop都多一個left)
優點(只是部分)功能相對比較齊全可以生成器,佔記憶體小,安全,遍歷速度比list快,可一賦多值查詢和插入速度快不用判斷重複的元素插入速度快
缺點相對tuple佔記憶體,查詢和insert時間較慢不能新增和更改元素佔記憶體大不能儲存可變物件,例如listremove和獲取索引的時候比較慢

二、關於時間複雜度

這裡簡單說一下相對序列關於時間複雜度的意思:

· O(1):常數級別,意思即時間保持在一個固定的範圍內,不會隨序列的長度和大小而增長。* 
·  O(n):線性級別,時間與序列的大小成正比,即序列元素越多,越長,所花時間越多* 
·  O(k):官網上說,“n”是容器中當前的元素的數量。’k’是引數的值或引數中元素的數量。但是目前我還不太清楚它是什麼意思,我看到第一個例子用在了pop上,所以猜測是隨它變化,具體求哪位大神能給解釋一下* 
· 還有一些類似O(n log n)和O(n^2) ,你畫個圖就知道了,具體日後有時間補

注意:

  1. 因為tuple不能增刪改,所以這裡不做比較。

  2. 因為deque只是和list樣子相似,但作用和queue相似,看名字就知道了,所以它只能從兩端增刪,不能從中間增刪,它也就沒有insert或者update這樣的方法。

  3. pop各種方法有些不一樣,另外我們知道pop的時候它會返回被刪掉的資料。因此,pop我們會分為pop last、pop(index[list]/key[dict]),但實際上他們的命令都是pop:

    1. deque:popleft是其獨有,但它的pop不能從指定的位置刪
    2. list:list/dict都可以從指定位置刪,list簡單直接給pop(index)即可
    3. set:set其實有pop,但它既不能指定,且沒有所謂最後一個,也是隨機,其他得用remove或者discard(區別在於如果元素不存在,前者會報錯而後者不會)
    4. dict: 根據官網來看,dict的複雜度平均是O(1),最壞的結果才是O(n)。只是佔記憶體一些,dict的pop比較特殊: 
      1. - popitem():這個尤其特別,它隨機返回並刪除字典中的一對鍵和值。為什麼隨機呢,因為dict是無序的,沒有所謂最後一個
      2. - pop(key[,default]):刪除字典給定鍵 key 所對應的值,返回值為被刪除的值。key值必須給出。 否則,返回default值。
  4. 由於無序序列的存在,設定了中括號標註下哪個方法是對應哪個序列的,這裡的中括號不代表索引,這裡索引直接用index代替

平均情況下:

序列listdequedictset
insert√ O(n)×××
append√ O(1)√ O(1)××
appendleft×√ O(1)××
extend√ O(k)√ O(1)××
extendleft×√ O(1)××
add×××√ O(1)
update××√ O(1)√O(1)
remove√O(n)×
clear×
del√ O(n)√ O(1)
popleft×√ O(1)××
pop last(pop()[list])√ O(1)√ O(1)××
pop(index[list]/key[dict])√ O(k)√ O(1)√ O(1)×
popitem()××√ O(1)×
Iteration(迭代)√ O(n)√ O(n)√ O(n)
x in s (查詢)√ O(n)√ O(n)√ O(1)√ O(1)

特點:

  1. tuple:

    1. tuple可雜湊,所以它可轉換成dict和set,它做dict——{():value}
    2. tuple的優點: 
      2.1. 函式返回多個值, 
      2.2. 字串裡有多個元素,如果剛好這些元素處於一個列表或tuple內,可以直接用,但是列表需轉換, 
      2.3. 可以快速調換賦值,如a,b = b,a
    3. 定義只有一個元素的tuple時候,必須寫成這種格式,即加個逗號, 如a = (1,),否則預設為進行()的運算。
  2. dict:

    1. dict的最好和平均時間是O(1),最差是O(n),set大多和dict差不多
  3. set:

    1. set儲存的元素和dict的key類似,必須是不變物件,所以set不支援list/dict,它可以通過update的方式將list的元素一個個新增到set裡,但不支援整個list,set 和dict轉換隻會用到它的key而不是value)
    2. 你在最初set([1,2,3])時,它會轉換為{1,2,3}。
    3. 不過它轉換成list很方便,只需要list(set())即可,而不用遍歷set中的元素
    4. set(i for i in range(n))比set([i for i in range(n)])要快一些,因為前者用到了生成器,來源於,但是如果要遍歷,後者可能更快(參考連結9)
  4. 查詢(即x in s):dict,set是常數查詢時間(O(1)),list、tuple是線性查詢時間(O(n))

優化:

  1. list因為佔用的記憶體會隨著元素的增大而增大,所以最好不要用 List 來儲存中間結果,而是通過 iterable 物件來迭代。(參考連結)
  2. 由表3可知,在判斷某個元素是否在某個序列中的時候,dict是O(1),list需要遍歷,所以是O(n),這時候儘量不要用list,能夠用字典進行儲存,儘量不要用list。如果覺得list和dict轉換麻煩,可以用set,set和list的轉換比較方便,總之可以避開直接用list。儲存的時候似情況而定用list還是set,這樣可以省去轉換。

參考https://blog.csdn.net/qq_28304687/article/details/79088491

相關推薦

python list/tuple/dict/set/deque簡單比較優化時間複雜

一、關於增刪改查序列listtupledictsetdeque能否增加元素√×√√√是否有序√√××√能否刪除√×√√√可否雜湊×√√√×序列listtupledictsetdeque增加方法append、extend、insert×updateadd、updateappen

Python中內置數據類型list,tuple,dict,set的區別用法

必須 div bsp 10個 用法 保險 進行 mov python Python語言簡潔明了,可以用較少的代碼實現同樣的功能。這其中Python的四個內置數據類型功不可沒,他們即是list, tuple, dict, set。這裏對他們進行一個簡明的總結。

pythonlist/tuple/dict/set的區別

代碼 方法 num super 三維 .get 浮點數 計算 keyword 序列是Python中最基本的數據結構。序列中的每個元素都分配一個數字 - 它的位置,或索引,第一個索引是0,第二個索引是1,依此類推。Python有6個序列的內置類型,但最常見的是列表list和元

Python容器--list, tuple, dict, set

差集 express 賦值 大括號 占用 字典 由於 xtend insert ## Python 中有四種用於存放數據的序列--list, tuple, dict, set ## list 列表   - 可以存放任意類型數據的有序序列   - 列表可以由零個或多個元

python :基礎資料型別list , tuple , dict, set方法彙總

#基礎資料型別方法 (1)list常用方法彙總‘ (1.1)新增類 append(*args,**kwarsg) # 向列表的尾部追加元素 extend(iterable) #向列表的尾部追加可迭代物件元素 list = [] list_add = [1,2,

python入門之Pythonlist,tuple,dict,set辨析

1.list用法 list,顧名思義,是一個集合,用L=[a,b,c]表示。集合中可以包含任意型別的元素,且是有序的,可以通過下標來訪問。 支援倒序訪問, List通過內建的append()方法來新增到尾部,L.append(‘sth’) 通過insert()方法新增到指定位置

Pythonlist,tuple,dict,set的區別用法

    Python語言簡潔明,可以用較少的程式碼實現同樣的功能。其中Python的四個內建資料型別功不可沒,即是list, tuple, dict, set。List在Python中List中的元素用中括號[]來表示,可以這樣定義一個List:L = [12, 'China

pythonlist ,tuple,dict,set的關係以及不可變物件解釋(圖文詳解)

list 1.list可以放進tuple (易知) 2.list可以放入dict作為value,但不可以作為key >>> key = [1, 2, 3] >>> d[key] = 'a list' Traceback (most

【原創】可修改==不可做index/key,可下標==有index/key==可查詢:嘗試 list tuple dict set的巢狀,包括str int等

語法總結 1 再確認一次,在語言使用時 "string " 等同於 'string'  沒區別 2 無論tuple ,list , dict 本身是用不同的符號() [ ] {},但是引用 index/key 都使用 [ ]     tuple

list/tuple/dict/set

一.list(列表) 內建型別,長度可變的有序集合,索引從0開始,索引為負數是標識從右開始取,最右邊第一個是-1,以此類推.裡面的元素可以是不同型別的. 1.定義:a = [] #空列表 2.獲取長度: len(list_a) 3.追加元素: list_a.append(10) 4.覆蓋或替換: l

[python]list, tuple, dictionary, set的底層細節

list, tuple, dictionary, set是python中4中常見的集合型別。在筆者之前的學習中,只是簡單了學習它們4者的使用,現記錄一下更深底層的知識。 列表和元組 列表和元組的區別是顯然的:列表是動態的,其大小可以該標;而元組是不可變的

8大排序之(五)------簡單理解 基數排序 與時間複雜

什麼是基數排序? (一)基數排序的思想:把待排序的整數按位分,分為個位,十位.....從小到大依次將位數進行排序。實際上分為兩個                                           過程:分配和收集。                    

基於比較的排序,時間複雜下界是o(nlogn)的小證明

原因: 對於n個待排序元素,在未比較時,可能的正確結果有n!種。 在經過一次比較後,其中兩個元素的順序被確定,所以可能的正確結果剩餘n!/2種。 依次類推,直到經過m次比較,剩餘可能性n!/(2^m)種。 直到n!/(2^m)<=1時,結果只剩餘一種。此時的比較次數m為o(nlogn)次。 所以基於排

python list,tuple,set,dict相關操作

# -*- coding: utf-8 -*- """ Created on Thu Oct 18 10:30:51 2018 @author: admin """ #list操作 d=[i for i in range(10)] print(d) #新增元素 d.ap

python基礎數據類型: int bool str list tuple dict

超過 split 次數 替換 空格 rip 大小寫 字符串搜索 dac 一. int bit_length() 計算十進制轉化成二進制的有效位數 1 v = 11 2 data = v.bit_length() 3 print(data) View

python資料型別(string/list/tuple/dict)內建方法

Python 字串常用方法總結 明確:對字串的操作方法都不會改變原來字串的值 1,去掉空格和特殊符號 name.strip()  去掉空格和換行符 name.strip('xx')  去掉某個字串 name.lstrip()  去掉左邊的空格和換行符

python listdicttuple 的合併

1:list: 方法一 最原始,最笨的方法,分別從兩個列表中取出所有的元素,再放入新列表中就OK了。示例程式碼如下: ? 1 2 3 4 5 6 7 8 list1 = [1,2,3] list2 = [4,5,6] list_new = []

python 獲取list tuple dict中最大最小元素的操作

關於獲得列表或者元組甚至是字典中最大或者最小的元素有很多種方法,如排序再取最前或最後,也可以直接使用函式獲得,那麼費話不多說直接上乾貨 list = [1,2,3,4,5,8,7] tuple = (1,2,3,4,5,8,7) dict = {1:'a',2:'b',3

Python listdict問題解答

cal sub pri 回發 調用 port 一個 uil har 問題: 編寫一個函數 most_prolific,其將采用與上述 Beatles_Discography 示例相同的字典格式,並返回發布最多專輯的年份。如果在 Beatles_Discography 中調

python list tuple的增刪改查 及巢狀 range()函式

list[]可以進行 類似於字串的索引切片等操作 li = ['alex',[1,2,3],'wusir','egon','女神','taibai'] l1 = li[0] print(l1) l2 = li[1] print(l2) l3 = li[0:3] print(l3) ''' alex [