目前學習到的資料結構:
共同特點:
都是順序儲存,順序訪問的,都是可迭代物件,都可以通過索引訪問
這樣一類的結構稱為:線性結構
線性結構的特點:
例子如下:
for i in [1,2,3]:
print(i)12
3for i in 'i smart':
print(i)
i sm
art
>>> enumerate((1,2,3))
#這裡返回了乙個可迭代物件
看看可迭代物件是什麼:
>>> list(enumerate([1,2,3]))
[(0, 1), (1, 2), (2, 3)]
在這裡用**實現乙個enumerate()函式:
#方式一,用yield封裝:
def new_enumerate(iterator):
i = 0
for v in iterator:
yield i,v
i += 1
#方式二,便於理解:
def new_enumerate1(iterator):
ret =
i = 0
for v in iterator:
i += 1
return ret
什麼時候用到enumerate:同時獲取索引和value的時候需要用這個函式。
例子:如果有乙個list,這個list裡是乙個個的使用者物件,而你在邏輯裡還需要對他們的索引作計算:
>>> users = ['punch', 'xu', 'kidult', 'justin']
>>> for i,user in enumerate(users):
... print(i,':', user)
...0 : punch
1 : xu
2 : kidult
3 : justin
關於range()函式,用來獲取一段範圍內的數字,可能是連續的,可能不是連續的。
range(1,10,2),三個引數分別代表:
>>> list(range(1,10,3))
[1, 4, 7]
next函式是用來迭代可迭代物件的。next函式需要乙個迭代器,而iter方法可以轉化可迭代物件為迭代器。next不能直接迭代可迭代物件,list是乙個可迭代物件,需要iter函式將可迭代話物件轉換成迭代器。
>>> it = iter(list((1,2,3)))
>>> it
>>> next(it)
1>>> next(it)
2>>> next(it)
3>>> next(it)
traceback (most recent call last):
file "", line 1, in stopiteration
#當next將迭代器的元素都迭代過一遍之後,再迭代就會丟擲stopiteration異常
可迭代物件可以通過iter函式轉換為迭代器,之後迭代器便可用next函式迭代
將list轉化為迭代器這種方式,方便我們來獲取資料,降低效能消耗。
>>> lst = list(range(10))
>>> lst[3]
3
這個操作是通過索引獲取列表的具體某乙個元素
這個不是切片,切片是選擇某一段:
>>> lst[3:7]
[3, 4, 5, 6]
lst是從0開始的連續整數,而索引也是從0開始的,因此索引為3的元素是對應整個列表從左往右的第4個元素。
而索引為7的元素,這裡則規定,切片操作是左閉右開的取值範圍。從3開始,再7前面乙個結束。
即:lst[start:stop],可以訪問lst從start開始到stop-1結束,不包含stop,並且原地不修改,有返回值。
#當start為0時可以省略:
>>> lst[:4]
[0, 1, 2, 3]
#當想獲取最後乙個值時可以省略stop引數:
>>> lst[7:]
[7, 8, 9]
#'lst[:]',等效於copy方法
>>> l2 = lst[:]
>>> l2
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> lst
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> lst[0] = 'a'
>>> lst
['a', 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l2
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#stop超出索引範圍
>>> lst[:1000]
['a', 1, 2, 3, 4, 5, 6, 7, 8, 9]
#start超出索引範圍
>>> lst[-100:]
['a', 1, 2, 3, 4, 5, 6, 7, 8, 9]
#start和stop都超出索引範圍
>>> lst[-100:100]
['a', 1, 2, 3, 4, 5, 6, 7, 8, 9]
#當start >= stop時,返回空列表
>>> lst[4:3]
#負數索引,實際上等於len(lst)+index,
>>> lst[3:-3]
[3, 4, 5, 6]
用**實現一遍:
def _slice(lst,start=0,stop=0):
#判斷start和stop小於0時做什麼
if start < 0:
start = len(lst) + start
if stop <= 0:
start = len(lst) +stop
#這裡時判斷越界行為
if stop <= start:
return
if stop > len(lst):
stop = len(lst)
#儲存切片後的結果
ret =
#這裡把元素索引和start、end對應起來
for i,v in enumerate(lst):
if i >= start and i < stop:
return ret
lst[start:stop:step],step引數表示一次增加多少
>>> lst[3:9:2]
[3, 5, 7]
>>> lst[9:3:-2]
[9, 7, 5]
>>> lst[::-2]
[9, 7, 5, 3, 1]
#下面為小技巧,可直接將列表倒序
>>> lst[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 'a']
實現帶step的方法:
def _slice(lst, start=0, stop=0, step=1):
#儲存切片後的結果
ret =
current = start
if step > 0:
while current < stop:
try:
except indexerror:
pass
current += step
if step < 0:
while current > stop:
try:
except indexerror:
pass
current += step
return ret
感覺這一章的知識還是非常實用的。
enumerate這個方法在列表迴圈的時候也是用的非常多,一次迴圈獲取索引和元素,能夠快速實現業務邏輯。
迭代器也是十分重要。用來做懶惰求值,提公升**效能。
STL學習筆記1 線性結構
list使用了不連續分配的記憶體 container iterator iter tempit for iter cont.begin iter cont.end 假設cont是乙個container的示例,裡面包含數個元素,那麼當container為 1 vector 2 list 3 map 4...
線性結構與非線性結構
對於資料結構,感情是 在撓頭也要學啊 我愛資料結構,資料結構使我快樂 呵 這裡一點一點開始扯 線性資料結構 定義為 1.有唯一的首元素及尾元素,2.資料元素之間是一對一關係 3.除首元素和尾元素外,每個元素都只有唯一的前段和後端 我詞真窮 樣例 線性表,堆,棧,佇列,陣列 基本指一維的 鍊錶 非線性...
線性結構與非線性結構
線性結構與非線性結構。線性結構?2.1線性結構 線性表,佇列,棧,陣列 2.1.1線性表?j a中的具體實現arraylist 順序表 優點 隨機儲存,讀取資料快 缺點 增加刪除資料慢?2.1.2鏈式表 j a中具體的實現linkedlist 鏈式表 優點 增加刪除快 缺點 新增 讀取慢?2.1.3...