資料結構是計算機中儲存、組織資料的方式。它包含三方面的內容,邏輯結構、儲存結構和運算。邏輯結構分為線性結構和非線性結構,線性結構如線性表、棧、佇列。非線性結構如樹和圖;儲存結構分為順序儲存和鏈式儲存。運算如檢索、排序、插入、刪除和更新。Python的內建資料結構是系統自己定義好的,不需要我們自己去定義。如列表、元組、字典,集合。列表、元組可看做是基於順序表設計的。
內建資料結構建立建立列表,元組,字串字典和集合的方法,空列表是[],空元組是(),空字串是'',空字典是{},空集合只能透過set()函式進行建立。
# 列表list1=[] #list1=['a','b',1,2]list2=list()#元組tup1=() # tup1=('a','b',1,2)tup2=tuple()#字串str1='' #str='ab12'str1=str()#字典dict1={} #dict1 = {'id':1,'name':'張三'}dict2=dict()# 建立字典的構造器語法items1 = dict(one=1, two=2, three=3, four=4)# 透過zip函式將兩個序列壓成字典items2 = dict(zip(['a', 'b', 'c'], '123'))# 建立字典的推導式語法items3 = {num: num ** 2 for num in range(1, 10)}#集合a={1,2,3,4} #建立空的集合不能用{},{}是字典b=set()
取值列表,元組,字串(可以看做字元列表)都是序列,取值可以透過索引和切片。索引是值在序列中的位置,分為正索引和負索引,正索引是從0開始,從左到右,第一個的元素的索引是0,負索引從-1開始,從右到左,最後一個元素的索引是-1。符合序列的有序序列都支援切片(slice),格式是[start:stop:step]。
start:開始索引,如果沒有指定,則預設值為0,負數表示從右邊開始算起。stop:結束索引,如果沒有指定,則取列表允許的最大值。step:步長值,如果沒有指定,則預設值為1,步長為正時,從左到右取值,步長為負時,反向取值。左閉右開,假設a=[1,2,3,4,5],a[0:3:1] 輸出:[1,2,3],取a[0]的值,不取a[3]的值。# 列表list1=['a','b',1,2]list1[0] # 'a'索引取值list1[0:2:1]#['a','b'] 切片list1[-1:] #[2]list1[::-1]#[2,1,'b','a']#元組tup1=('a','b',1,2)tup1[0] #'a'tup1[0:2:1]#('a','b')tup1[-1:]#(2,)元組只有一個元素的時候,要在元素後面加一個逗號。tup1[::-1]#(2,1,'b','a')#字串str1='ab12'str1[0] #'a'str1[0:2:1] #'ab'str1[-1:] # '2'str1[-1:] # '21ba'
字典是基於雜湊表設計的,由<鍵><值>對組成,取值透過鍵(key)。集合是一個無序集合,沒有重複元素,常用刪除重複項。
#字典dict1 = {'id':1,'name':'張三','sex':'男'}dict1['id'] # 1# 集合my_list = [1, 2, 3, 2, 3, 4]no_duplicate_list = list(set(my_list)) # [1, 2, 3, 4]
遍歷
元素的遍歷,透過for ... in 語句。
# 列表,元組字串方法一樣# 1 透過索引for index in range(len(list1)): print(list1[index]) # a b 1 2# 2 透過元素for elem in list1: print(elem) # a b 1 2# 3 透過enumerate(列舉)函式for index, elem in enumerate(list1): print(list1[index]) print(elem)# 字典# 1 遍歷keyfor key in dict1.keys(): print(key) # id name sex#2 遍歷valuesfor value in dict1.values(): print(value) # 1 張三 男# 3 透過items函式,返回(鍵,值)元組for key,value in dict1.items(): print(key,value)#id 1 name 張三 sex 男# 遍歷kvfor kv in dict1.items(): print(kv) #('id', 1) ('name', '張三') ('sex', '男')# 集合set1={1,2,3,4,5}for elem in set1: print(elem) #1 2 3 4 5
常用運算插入 列表為insert,格式insert(index, obj),將某個元素插入指定的位置。append在尾部插入;元組建立後,不可修改;字典為dict[key] = value,key存在即修改,不存在即新增;集合可以透過add和update新增。
# 列表 list1.insert(2,'c') # ['a', 'b', 'c', 1, 2]
list1.append('3')
#元組 建立後,不可修改,可轉換成列表。
# 字典
dict1['num']='15767' #{'id': 1, 'name': '張三', 'num': '15767', 'sex': '男'}
# 集合
set1.add(6) # {1, 2, 3, 4, 5, 6} set1.update('6')
# 列表
list1.remove('c')
list1.pop(2)
#字典
del dict1['num']
dict1.pop('num')
#集合
set1.remove(1) # 如果元素不存在,會報錯
set1.discard(1) #如果元素不存在,會報錯
排序列表sort(),sorted,sorted返回排序後的序列。元組和字串可以轉換為列表排序。字典預設對key值進行排序,透過key引數,可以指定按照value值對key進行排序。集合會自動排序,
#列表 #sort() 函式list=[2,3,1,5,4]list.sort() #[1,2,3,4,5]list.sort(reverse=True) #[5,4,3,2,1] reverse=True 降序#key引數用來指定對那個元素進行排序。list1 =[('b',6),('a',1),('c',3),('d',4)]list.sort(key=lambda x:x[1])#[('a', 1), ('c', 3), ('d', 4), ('b', 6)]#sorted()函式sorted(list1,key=lambda x:x[1],reverse=True)#[('b', 6), ('d', 4), ('c', 3), ('a', 1)]#字典d = {'a': 2, 'A': 1, 'c': 3, 'b': 2}sorted_key_list = sorted(d) #預設透過key對字典進行排序#輸出:['A', 'a', 'b', 'c']#sorted_key_list = sorted(d,reverse=True) sorted_key_list = sorted(d, key=lambda x:d[x]) #透過key引數,指定按照value進行排序。#輸出:['A', 'a', 'b', 'c']# sorted_key_list = sorted(d, key=lambda x:d[x], reverse=True) #集合set={1,5,2,4,3}print(set) #{1,2,3,4,5}
推導式推導式comprehensions(又稱解析式),是Python的一種獨有特性。推導式是可以從一個數據序列構建另一個新的資料序列的結構體。分為列表、字典和集合三種。
列表推導式格式:變數名=[表示式 for 變數 in 列表]
# 不使用列表推導式,給list1賦值過程
list1 = []
for i in range(10):
list1.append(i)
print(list1) #結果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#以下為列表推導式的使用,第一個和上面結果一樣
list2 = [i for i in list1]
print(list2)#結果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
字典推導式格式:變數名={ key: value for 變數 in 字典 }
dict1 = {'id':1,'name':'張三','sex':'男'}
dict2 = {k : v for k, v in dict1.items()}
print(dict2) #結果:{'id': 1, 'name': '張三'}
集合推導式格式:變數名={表示式 for 變數 in 集合}
set1 = {i * 2 for i in range(10) }
print(set1)#結果:{0, 2, 4, 6}