python基礎之dict和set

2021-09-30 21:08:20 字數 2998 閱讀 9895

前一篇寫了列表(list)和元組(tuple)的區別,python還有另外兩個很常用的集合(set)與字典(dict)。它們的優勢是高效的查詢和增加,刪除, 這些操作的時間複雜度均為o(1), 在有些場合,非常適用。

什麼是字典(dict), 在python中,字典是一系列無序的鍵值對的組合,字典的內容可以增加也可以改變。由於它是使用雜湊表實現的,所以相對於列表,字典的增刪改查操作更高效。

那集合(set)呢,和字典的實現非常類似,唯一的區別在於集合裡的元素不是鍵值對,是單一的乙個元素。

同列表和集合一樣,python裡字典和集合中的元素的型別都是混合型的,不一定必須要是同一型別元素。

使用字典有乙個常用的場景就是通過鍵去查值,可以這樣通過鍵來索引:

d =

print

(d['a'])

# 輸出 1

但是如果我們不確定』c』這個鍵是否存在於字典d中,使用操作d[c]來索引就會報錯:

keyerror                                  traceback (most recent call last)

in ()

----> 1 d['c']

keyerror: 'c'

所以更好的方法是使用get()方法,如下:

val = d.get(

'c',

0)

這樣即使鍵』c』不存在,也會返回乙個預設值0,而不是報錯。

另外乙個常用的場景是,我們經常需要對字典進行遍歷操作:

d =

for key in d:

# 和for key in d.keys():這樣寫是一樣的效果

print

(d[key]

)

集合的增加比較簡單,直接使用add()方法就可以:

s =

s.add(

'c')

# 對列表裡的元素進行去重操作

l =[1,

2,3,

1]l_s=

set(l)

# 避免重複操作,利用了集合查詢的高效性

l =[1,

2,3,

1,4]

s =set()

for index, item in

enumerate

(l):

if item in s:

continue

else

:# do what you want to do

s.add(item)

最上面我們說過,python中字典和集合的增刪改查效能非常高,現在我們來舉個例子說明,這也是字典和集合經常使用的場景, 假設我們後台存有市民的身份證號和姓名資訊,我們現在有乙個需求是通過身份證號查人名,使用列表的實現如下(身份證號簡寫):

l =[(

420213

,'zhangsan'),

(420382

,'lisi'),

(321962

,'wangwu')]

deffind_name

(id_no)

:for id_num, name in l:

if id_num == id_no:

return name

return

none

這個實現實際上是需要遍歷整個列表l,它的平均時間複雜度是o(n), 假設我們有100萬使用者,那查詢效率可想而知有多差。但是如果採用字典儲存的話,它的實現如下:

l =

deffind_name

(id_no)

:return l.get(id_no,

none

)

字典查詢的時間複雜度是o(1), 也就是說,無論是1個使用者,還是100萬使用者,它的查詢耗時更加穩定,顯然這種實現方式要更加高效。

假設我們的需求變成,統計所有使用者一共有多少個不同的名字, 即不重複的名字有多少個,先不管這個需求是否合理,如果用列表實現,如下:

l =[(

420213

,'zhangsan'),

(420382

,'lisi'),

(321962

,'wangwu')]

deffind_name_cnt

(lis)

: unique_list =

for id_num, name in lis:

if name not

in unique_list:

return

len(unique_list)

上面**中,我們使用了乙個列表來儲存找到的不相同的名字,這裡在從unique_list裡查詢是否有重複的時候,時間複雜度是o(n), 而最外層遍歷整個列表時,時間複雜度同樣是o(n), 所以整個**時間複雜度是o(n2),效率很差,如果將unique_list換成集合呢?

l =[(

420213

,'zhangsan'),

(420382

,'lisi'),

(321962

,'wangwu')]

deffind_name_cnt

(lis)

: unique_set =

set(

)for id_num, name in lis:

unique_set.add(name)

return

len(unique_set)

因為集合中不會存在重複的元素,所以不需要查詢,而且集合的實現也是雜湊表,它插入的時間複雜度同樣是o(1),所以這代**的時間複雜度是o(n),效率要高出很多。

字典和集合是兩個非常重要的基礎資料結果,它們大大提高了增刪改查的效率,我們需要學會靈活使用它們

Python基礎之dict和set

使用鍵值對 key value 儲存,具有極快的查詢速度 把資料放入dict的方法除了初始化指定外,還可以通過key放入 由於乙個key只能對應乙個value,所以,多次對乙個key放入value,後面的值會把前面的值沖掉 如果key不存在,dict就會報錯 為了避免key不存在的錯誤 1.通過in...

Python基礎語法之dict和set

dict字典類似於c stl 中的map set類似於stl中的set,無重複集合 usr bin env python3 coding utf 8 字典的表達形式 d print d zhangsan 通過key來修改字典中鍵值對 d zhangsan 99999 print d zhangsan...

Python基礎之字典dict

字典的特性,鍵值對出現 字典的定義 字典的key不可重複,如果key重複的話,預設最後乙個元素新增到字典中,多個元素之間用逗號分割。字典是無序的 定義乙個字典 例 dic 字典的常用方法 fromkeys 引數是乙個可迭代型別,把每乙個迭代物件變成字典的key,value預設為none 可以修改 例...