Python學習筆記 線性結構與切片

2021-09-25 08:04:20 字數 4204 閱讀 2023

目前學習到的資料結構:

共同特點:

都是順序儲存,順序訪問的,都是可迭代物件,都可以通過索引訪問
這樣一類的結構稱為:線性結構

線性結構的特點:

例子如下:

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...