Python雜湊表和解析式

2021-10-08 10:30:04 字數 4899 閱讀 2347

[toc]

說明: 等號(=)右邊有多個數值僅通過逗號分割,就會封裝到乙個元組,稱為封裝packing。

# 示例:

x = 1,

y = 1,2

print(type(x), x)

print(type(y), y)

# 輸出結果如下:

(1,)

(1, 2)

備註: 如果右邊只有乙個數值且沒有用逗號,其實是乙個整數型別,請留意。另外等號右邊一定先執行,再賦值給左邊。

說明: 等號(=)右邊容器型別的元素與左邊通過逗號分割的變數要一 一對應,稱為解構unpacking。

x,y = (1,2)  # [1,2]  

print(x)

print(y)

# 輸出結果如下:

12

備註:右邊的容器可以是元組、列表、字典、集合等,必須是可迭代物件。

錯誤示範:

x,y = (1,2,3)

print(x)

print(y)

# 輸出結果如下:

valueerror: too many values to unpack (expected 2)

說明:左、右兩邊個數一定要一致,不然會丟擲'valueerror'錯誤。

剩餘變數解構

說明:python3引入了剩餘變數解構(rest),'盡可能'收集剩下的資料組成乙個列表。

x, *rest = [1,2,3,4,5,6]

print(type(x), x)

print(type(rest), rest) # 剩餘沒有賦值的就是rest的了

# 輸出結果如下:

1[2, 3, 4, 5, 6]

*rest, y = [1,2,3,4,5,6]

print(type(rest), rest)

print(type(y), y)

# 輸出結果如下:

[1, 2, 3, 4, 5]

6

錯誤示例:

另外一種丟棄變數下劃線:'_'

說明: '_'是合法的識別符號,大多場景表示不關心該值。

x, *_, y = [1,2,3,4,5,6]

print(x)

print(_)

print(y)

# 輸出結果如下:

1[2, 3, 4, 5]

6

_, *rest, _ = [1,2,3,4,5,6]

print(_) # '_'是上一次輸出值

print(rest)

# 輸出結果如下:

6[2, 3, 4, 5]

說明:集合是'可變的、無序的、不重複'的元素集合。

成為集合元素是有條件的:'元素必須可hash、可迭代'

可雜湊物件如下(不可變):

可以通過內建hash函式判斷是否可hash:

s1 = [1,2,3]

print(hash(s1))

# 輸出結果如下:

typeerror: unhashable type: 'list' # 列表是不可hash的

說明:

s = {}  # 注意這個是空字典,不是空集合

s1 = set() # 空集合

s2 = set([1,2,3]) # 注意列表裡面元素迭代出來的是整數,可hash

s3 = set("abcd")

print(s1)

print(s2)

print(s3)

# 輸出結果如下:

set()

錯誤示例:

s = set([[1]]) # 列表套列表,迭代出來是列表,不可hash

print(s)

# 輸出結果如下:

typeerror: unhashable type: 'list'

s1 = set([1,2,3])

s1.add(4)

print(s1)

# 輸出結果如下:

s1 = set([1,2,3])

s1.update((4,5,6),[7,8,9])

print(s1)

# 輸出結果如下:

說明:集合是個容器,是可以遍歷的,但是效率都是o(n)。

s1 = 

for s in s1:

print(s)

# 輸出結果如下:12

3

說到這裡,你覺得集合set和列表list哪個遍歷效率更高呢?

答案是set,因為set的元素是hash值作為key(下面講的字典也是hash值),查詢時間複雜度為o(1),而list是線性資料結構,時間複雜度是o(n)。

大家可以按照如下進行驗證下,隨著資料規模越來越大,很明顯就可以看出哪個效率高。

說明:字典是由任意個item(元素)組成的集合,item是由key:value對組成的二元組。

# 空字典

d1 = {}

d2 = dict()

# 示例:

d3 = dict(a=1,b=2,c=3)

d4 = dict(d3)

d5 = dict([('a',1),('b',2),('c',3)]) # 元素必須是可迭代的

d6 =

# 輸出結果都是:

d = 

print(d.pop('c',none))

print(d)

# 輸出結果如下:

3

2)d.popitem()

d = 

print(d.popitem())

print(d)

# 輸出結果如下:

('c', 3)

3)d.clear()

d = 

d.clear()

print(d)

正常訪問元素:

d = 

print(d['a'])

print(d.get('b'))

# 輸出結果如下:

12

key不存在的處理方式:

d = 

print(d.get('d',none)) # 如果key不存在,預設返回none

print(d.setdefault('d',100)) # 如果key不存在,則新增key:value對

print(d)

# 輸出結果如下:

none

100

語法

優點 示例需求:請從給定區間中提取能夠被2整除的元素。

大眾普遍的寫法:

list = 

for i in range(10):

if i % 2 == 0:

print(list)

# 輸出結果如下:

[0, 2, 4, 6, 8]

再來感受一下簡單而優雅的寫法:

print([i for i in range(10) if i % 2 == 0])

# 輸出結果如下:

[0, 2, 4, 6, 8]

以上就是列表解析式,也叫列表推倒式。語法

特點:

看下生成器物件是長什麼樣的(不要認為是元組解析式,哈哈):

x = (i for i in range(10) if i % 2 == 0)

print(type(x))

print(x)

# 輸出結果如下:

# 生成器

at 0x000001a143acba98> # 生成器物件

那生成器物件是如何計算得到結果:

import time

x = (i for i in range(10) if i % 2 == 0)

for i in range(6): # 僅一次迴圈取值

time.sleep(0.5)

print(next(x))

time.sleep(1)

print(next(x)) # for迴圈已經計算完所有結果了,不能取值,故丟擲異常

# 輸出結果如下:02

468stopiteration # 已經超出可迭代範圍,丟擲異常

備註:生成器表示式只能迭代一次。

集合解析式和列表解析式語法類似,不做過多解析。

語法:

示例:

print()

# 輸出結果如下:

字典解析式和集合解析式語法類似,不做過多解析。

語法:

示例:

print()

# 輸出結果如下:

總體來說,解析式寫起來如果讓人簡單易懂、又高效,是非常推薦大家使用的。

但有的場景寫起來很複雜,那還是得用for...in迴圈拆分來寫。

字典和解析式

key value鍵值對的資料的集合 可變的 無序的key不重複d key 返回key對應的值value key不存在丟擲keyerror異常 get key default 返回key對應的值value key不存在返回預設值,如果沒有設定預設值就返回none setdefault key def...

Python基礎 迭代和解析

for迴圈可以迭代序列物件,從左到右遍歷序列物件的元素。這裡for迴圈屬於迭代工具,而序列屬於可迭代物件,兩者通過迭代協議聯絡。python提供了內建函式next,以迭代器做輸入,每次返回序列的下一元素,直到序列末尾,引發異常 i iter 1,2,3,4 next i 1 next i 2 nex...

雜湊表原理解析

雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構,它通過對映函式把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。關鍵碼值 key value 也可以當成是key的hash值,這個對映函式叫做雜湊函式。而存放記錄的陣列叫做雜湊表 根據上述...