Python語法速查: 15. 常用數據結構

来源:https://www.cnblogs.com/initcircuit/archive/2019/12/05/11975919.html
-Advertisement-
Play Games

返回目錄 本篇索引 (1)array (2)bisect (3)deque (4)defaultdict (5)namedtuple (6)heapq (7)itertools (1)array array模塊定義一個數組類型:array,它與列表很相似,但它的內容僅限於單一類型。如果需要有效利用存 ...


返回目錄

 

本篇索引

(1)array

(2)bisect

(3)deque

(4)defaultdict

(5)namedtuple

(6)heapq

(7)itertools

 

 

 (1)array

array模塊定義一個數組類型:array,它與列表很相似,但它的內容僅限於單一類型。如果需要有效利用存儲空間,那麼就需要用到array模塊。 例如,要存儲1000萬個整數,使用列表需要約160M記憶體,而使用array僅需40M記憶體,代價是array的操作比列表要慢一些。

array數組不適用於數字操作(如矩陣運算),要創建高效存儲和計算的數組,可使用numpy擴展。

“+”運算符用於附加另一個數組的內容,“*”運算符用於重覆附加一個數組。

● array(typecode [,initializer])

說明:

創建類型為typecode的數組,可取類型見下表。initializer是一個字元串或值列表,用於初始化數組中的值。

 

typecode取值類型

類型編碼描述對應C類型最小大小(位元組數)
'c' 8位字元 Char 1
'b' 8位整型 signed char 1
'B' 8位無符號整型 unsigned char 1
'u' Unicode字元 PY_UNICODE 2或4
''h 16位整型 short 2
'H' 16位無符號整型 unsigned short 2
'i' 整型 int 4或8(64位架構)
'I' 無符號整型 unsigned int 4或8(64位架構)
'l' 長整型 long 4或8(64位架構)
'L' 無符號長整型 unsigned long 4或8(64位架構)
'f' 單精度浮點數 float 4
'd' 雙精度浮點數 double 8

 

array實例常用屬性和方法

屬性或方法說明
a.typecode 屬性,數組的編碼字元。
a.itemsize 屬性,存儲在數組中項的大小(以位元組為單位)。
a.append(x) 將x附加到數組末尾,若插入類型不匹配,則引發TypeError異常。
a.buffer_info() 返回(address, length)元組,反映數組緩衝區的記憶體位置和長度。
a.byteswap() 切換大端和小端的位元組順序,僅支持整型值。
a.count(x) 返回數組中出現x的次數。
a.extend(b) 將b附加到數組末尾,b也可以是一個數組。
a.fromfile(f, n) 從文件對象f中讀取n個項(二進位格式),並附加到數組末尾。若可讀取的項少於n,則引發EOFError異常。
a.fromlist(list) 將list中的項附加到數組末尾,list可以是可迭代對象。
a.fromstring(s) 將字元串s中的項附加到數組末尾,其中s是一個由二進位值組成的字元串(與fromfile()中格式相同)
a.index(x) 返回x在數組中首次出現的位置索引,若未找到,則引發ValueError異常。
a.insert(i, x) 在位置i前插入x。
a.pop([i]) 從數組中刪除項 i 並將其返回。如果i已被刪除,則刪除最後一個元素。
a.remove(x) 從數組中刪除第一個x,若未找到,則引發ValueError異常。
a.reverse() 反轉數組的順序。
a.tofile(f) 將所有項寫入文件f。數據保存為本機二進位格式。
a.tolist() 將數組轉換為普通的值列表。
a.tostring() 將數組轉換為由二進位數據組成的字元串。
a.tounicode() 將數組轉換為Unicode字元串,如果數組類型不為'u',則引發ValueError異常。

 

 

 

 (2)bisect

bisect模塊可以在已排好順序的列表中插入一個新數據,並使列表維持已排好的順序,它使用二分法來執行大部分工作。

bisect的簡單用例:

s = [1,3,5,7,9]
bisect.insort(s, 6)     
print(s)

# 結果為:[1,3,5,6,7,9]

 

bisect模塊常用函數

屬性或方法說明
insort(list, item [,low [,high]]) 將item插入已排序好的列表list中。若item已在列表中,那麼新項將插到現有項的右邊。low和high是兩邊的要檢查子集的邊界。
insort_left(list, item [,low [,high]]) 功能同上,只是若item已在列表中,那麼新項將插到現有項的左邊。
insort_right(list, item [,low [,high]]) 同insort()
bisect(list, item [,low [,high]]) 計算如要將item插入到已排序好的的列表list中的插入索引點,並返回這個值。low和high是兩邊的要檢查子集的邊界。若item已在列表中,那麼新計算的插入位置在現有項的右邊。
bisect_left(list, item [,low [,high]]) 功能同上,只是若item已在列表中,那麼新計算的插入位置在現有項的左邊。
bisect_right(list, item [,low [,high]]) 同bisect()

 

 

 

 (3)deque

deque表示雙端隊列(發音:'deck'),要使用雙端隊列需要導入collections模塊。

雙端隊列允許在隊列的任一端插入或刪除項,性能接近O(1)。而列表若要在最前端插入項,需要移動所有後續對象。

若為deque指定了maxlen參數,則向已滿雙端隊列插入新項時,deque會自動在另一端刪除一個數據來騰出空間。

● deque[iterable [,maxlen]])

說明:

iterable是可迭代對象,可用於初始化deque;maxlen表示雙端隊列允許的最大空間。

 

deque實例常用方法

屬性或方法說明
d.append(x) 將x添加到d的右端。
d.appendleft(x) 將x添加到d的左端。
d.clear() 從d中刪除所有項。
d.extend(iterable) 將iterable中的所有項添加到d的右端,以擴展d。
d.extendleft(iterable) 將iterable中的所有項添加到d的左端,iterable中的項將按相反順序出現在d中。
d.pop() 返回並刪除d右端的項。若d為空,則引發IndexError異常。
d.popleft() 返回並刪除d左端的項。若d為空,則引發IndexError異常。
d.remove(item) 刪除首次出現的item,若未找到匹配值,則引發ValueError異常。
d.rotate(n) 將所有項向右旋轉n步,若n為負值,則向左旋轉項。

 

 

 

 (4)defaultdict

要使用defaultdict需要導入collections模塊。defaultdict與普通字典用法基本一樣,只是在缺少鍵的處理上有不同。當索引不存在的鍵名時,將調用default_factory提供的函數來提供一個預設值,然後將該值保存為鍵的值。其餘操作與內置dict()完全相同。

其實,普通的字典的setdefault()方法也能完成這一功能,只是setdefault()語句結構不是很清晰,且運行速度較慢。

初始化語法:

default([default_factory], ...)

 

用法示例,統計各個單詞出現的位置並將其位置序列放入字典中。

from collections import defaultdict
s = 'a b c a b c'
word_list = s.split()   # word_list值為:['a', 'b', 'c', 'a', 'b', 'c']
dd = defaultdict(list)
for i, w in enumerate(word_list):
    dd[w].append(i)
    
# 最終dd結果為:defaultdict(<class 'list'>, {'a': [0, 3], 'b': [1, 4], 'c': [2, 5]})

 

 

 

 (5)namedtuple

namedtuple表示命名元組,要使用namedtuple需要導入collections模塊。在命名元組中,可以使用屬性名稱來訪問元組元素,可以動態增加新屬性。缺點是比普通元組慢一點。

初始化語法:

namedtyple(typename, filednames [,verbose])

 

typename作為新創建的命名元組名稱(它是tuple的子類),fieldnames是字元串形式的屬性名稱的列表,不能以下劃線開頭。fieldnames也可寫成一個字元串,各屬性間用空格或逗號分隔。verbose標記若設為True,將向標準輸出端輸出生成的類定義。

使用命名元組的簡單示例:

from collections import namedtuple
NewAddrPort = namedtuple('NewAddrPort', ['ipaddr', 'port'])
a = NewAddrPort('127.0.0.1', 80)
print(a.ipaddr, a.port)
# 結果為:'127.0.0.1' 80

ipaddr, host = a      # 本句可將命名元組a像普通元組那樣解包展開。

isinstance(a, tuple)
# 結果為:True

 

如果定義一個僅作為數據結構的對象,那可以用命名元組來替代:

class Square(object):
    def __init(self, l, w):
        self.l = l
        self.w = w

# 可以用命名元組來替代:
import collections
Square = collections.namedtuple('Square', 'l w')
nt = Square(10, 20)

使用命名元組的優點是:可以像實例那樣來訪問屬性,如:nt.l、nt.w;也可以對nt像普通元組那樣使用for語句和解包語句。

 

 

 

 (6)heapq

heapq模塊使用堆實現一個優先順序隊列。優先順序隊列能以任意順序添加對象,並能隨時找出最小的元素,它比列表的min方法要快得多。

 

heapq模塊常用函數

函數說明
heapify(x) 將列表x原地轉換為堆。
heappop(heap) 返回並刪除heap中最小的項,若heap為空,則引發IndexError異常。
heappush(heap, item) 將item添加到堆中。
heappushpop(heap, item) 在一個操作中將item添加到堆並從heap中刪除最小項。這比分別調用heappush()和heappop()更高效。
heapreplace(heap, item) 返回並刪除堆中最小的元素,並同時添加一個新item。新項的添加在獲取返回值之後,因此返回值可能比item更大。若heap為空,則引發IndexError異常。
merge(s1, s2, ...) 創建一個迭代器,將有序的迭代變數s1, s2等合併到一個有序序列中。
nlargest(n, iter [,key]) 創建一個列表,包含iter中最大的n個項,最大項排在返回列表的前端。key是可選參數,接受一個輸出參數並計算iter中每個項的比較鍵。
nsmallest(n, iter [,key]) 創建一個列表,包含iter中最小的n個項,最小項排在返回列表的前端。key含義同上。

 

heap用法示例:

import heapq
x = [1,9,2,8,3,7,4,6]
heapq.heapify(x)    # 本句運行後,x已變成優先順序隊列
print(x)
>>> [1,3,2,6,8,7,4,9]   # x已按堆的優先順序排序好
heapq.heappop(x)
>>> 1
heapq.heappop(x)
>>> 2

 

 

 

 (7)itertools

itertools模塊包含創建高效迭代器的函數,可以用各種方式對數據執行迴圈操作。

 

itertools模塊常用函數

函數說明
chain(iter1, iter2, ..., iterN) 此函數創建一個新迭代器將所有入參迭代器鏈接起來,返回的迭代器從iter1的第1項開始,到iterN的最後一項。
chain.from_iterable(iterables) 一個備用鏈構造函數。
combinations(iter, r) 創建一個迭代器,返回iter中所有長度為r的子序列。例如:combinations([1,2,3], 2)生成的序列為:[1,2]、[1,3]、[2,3]。
count([n]) 創建一個迭代器,生成從n開始的連續整數,如果忽略n則從0開始。如果超出了系統的最大正整數範圍,則從系統最小負整數-1繼續。
cycle(iter) 創建一個迭代器,對iter中的元素反覆執行迴圈操作,生成一個迭代器副本。
dropwhile(predicate, iter) 創建一個迭代器,只要函數perdicate(item)為True,就丟棄iter中的項,若為False則存入此項到新迭代器。
filterfalse() 創建一個迭代器,僅生成iter中predicate(item)為False的項,若predicate為None,將返回iter中所有計算為False的項。
groupby(iter, [,key]) 創建一個迭代器,對iterable生成的連續項進行分組,在分組過程中會查找重覆項。
islice(iter [,start], stop [,step]) 創建一個迭代器,生成的項類似於切片返回值:iter[start:stop:step],但start, stop, step都不能使用負值。
permutations(iter [,r]) 創建一個迭代器,返回iter中所有長度為r的序列,若省略r,那麼序列長度與iter中的項數相同。
product(iter1, iter2, ..., iterN, [repeat=1]) 創建一個迭代器,生成表示item1, item2等中的項的笛卡爾積的元組。repeaet指定重覆生成序列的次數。
repeat(object [,times]) 創建一個迭代器,重覆生成object。times指定重覆計數,如果未指定times,將無止盡地返回該對象。
starmap(func [,iter]) 創建一個迭代器,生成值未func(*item),只有當iter生成的項適合用於這種調用函數的方式時,此函數才有效。
takewhile(predicate [,iter]) 創建一個迭代器,深禪iter中predicate(item)未True的項,只要predicate計算未False,迭代就會立刻停止。
tee(iter [,n]) 從iter創建n個獨立的迭代器,創建的迭代器以n元組的形式返回,n的預設值為2。

 

迭代器使用的一些示例:

from itertools import *

# 在數字0,1,...,10,9,8,...,1上無限迴圈
for i in cycle(chain(range(10), range(10,0-1))):
    print(i)
    
# 創建a中的唯一項列表
a = [1,2,3,4,2,3,4,5]
a.sort()
b = [k for k,g in groupby(a)]   # b = [1,2,3,4,5]

# 對x和y中所有可能的值對進行組合迭代
x = [1,2,3]
y = [10,11]
for r in product(x,y):
    print(r)
# 生成輸出:(1,10), (1,11), (2,10), (2,11), (3,10), (3,11)

 

 

 

 

返回目錄

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 解決方法 方法一:換一個埠 若仍然想要使用該埠,則可以將占用該埠的進程殺死即可。 方法二:殺死占用該埠的進程 若仍然想要使用該埠,則可以將占用該埠的進程殺死即可 查找埠被占用的進程id netstat -nao | findstr “埠號” 查詢埠號對應的進程 tasklist | ...
  • 想象一下,程式員沒有WIFI會怎樣? 程式員沒有網路肯定會寸步難行! 但是對於Python程式員來說,只要附近有熱點,分分鐘就能蹭網成功! 想要WIFI破解,python+字典,這是必少不了的。熱點加弱口令也是核心。字典自己加精,你的字典有強大,你能破解的WIFI就越多,提供兩種方法,一般人學到一種 ...
  • 1.os.path.exists()既可以判斷文件是否存在,又可以判斷文件夾是否存在 2.os.path.isfile()判斷文件是否存在 3.os.path.isdir()判斷文件夾是否存在 ...
  • 前言 這篇文章主要是從pinpoint web界面入手,我們的目標是弄清楚兩個問題: 1、 pinpoint左側服務地圖上的調用量數據是怎麼查詢的? 2、界面查詢條件WasOnly是什麼意思? 左側服務地圖調用量來源 從下圖可以看出,A顯示被USER調用299次,線上數值代表著調用量。 我們F12跟 ...
  • 元組 元組是一個輕量級集合,這個集合可以存儲任意元素 元組是使用小括弧,元素之間使用逗號分隔,元素的類型是任意的 若需要訪問元組中的元素 [元組名._數字] 數字是從1開始, 有多少個元素,這個1遞增多少次 例如: 有一個元組,元組中有三個元素 訪問每一個元素值 --> _1 _2 _3 元組屬於輕 ...
  • 網路編程tcp協議與socket以及單例的補充 一、單例補充 實現單列的幾種方式 二、tcp協議以及粘包問題 理論知識 三、socket套接字 socket套接字初級版本 演示 socket套接字升級版本 socket套接字高級版本 socket套接字終級版本 四、粘包問題 粘包問題的出現以及幾種情 ...
  • GC分類 針對HotSpot VM的實現,它裡面的GC其實準確分類只有兩大種: Partial GC:並不收集整個GC堆的模式 Young GC:只收集young gen的GC Old GC:只收集old gen的GC。只有CMS的concurrent collection是這個模式 Mixed G ...
  • TCP協議 TCP是傳輸控制協議,建立雙向通道。 三次握手,建立連接 客戶端向服務端發送建立連接的請求 服務端接收請求返回確認信息給客戶端,並向客戶端發送建立連接的請求 客戶端接收請求返回確認信息給服務端 反饋機制: 一次請求必須有一次響應 。即收到請求後,必須告知對方已收到請求。 四次揮手,斷開連 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...