前一篇寫了列表(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 可以修改 例...