《Python基礎教程》學習筆記 – Lesson02:列表和元組


在Python中最基本的數據結構是序列(sequence),第一個索引從0開始;


在Python中,索引可以是負數,-1表示最后一個元素(倒數第一),-2表示倒數第二個元素;


例如:

01(50)

 

通用序列操作


索引(indexing)、分片(sliceing)、加(adding)、乘(multiplying),判斷某個元素是否屬於該序列成員、此外,還有計算序列長度,找出最大或最小元素的內建函數;


索引


從 0 開始遞增,例:

01(51)

如果索引是負數,則會從最右邊開始,也就是從最后第一個元素開始計數,例:

01(52)

序列到 -5 的時候就是最后一個元素了(從右向左),等同於序列 0 ;

例:我們輸入一個年份,只對最后 2 位感興趣;

01(53)

這里使用 : 表示取一定范圍的元素,2:4 表示獲取第 3 個和第 4 個元素;

例:輸入年月日,以月/日/年的英文+數字形式打印出日期;

代碼:

01(54)

01-2(9)

運行結果:

02(7)

 

分片


可以使用分片操作( : )來訪問一定范圍內的元素,例:

01(55)

注意:分片操作,第一索引元素是包括其自身在分片內的,而第二個索引元素是不包括其自身在內的,類似數學上的半開區間 [a, b);

例:

01(56)

在分片操作中如果要取得最后一個元素,可以把第二個索引的最大值加一(以這個例子來說就是numbers[9,10]);

注意:如果分片中,左邊的索引比右邊出現的晚,結果就是一個空序,例:

01(57)

另外要取得的分片部分包括結尾元素,那么只需空置最后一個索引:
01(58)

這種方法同樣適用於序列的開始以及整個序列:

01(59)

例,輸入一個URL(假設形式為http://www.somedomainname.com),提取域名;

01(60)

 

步長

在進行分片的時候,默認步長(step length)是1,通常是隱式設置的,這里可以手動設置;步長可以為負數,那么它將會從右到左提取元素;

例:

01(61)

個人分析,其實就是設步長為n,分片起始地索引為f,分片結束索引為l,目前正在執行的索引序列為t,那么它的執行過程就是:

如果n為正值(偽代碼):

loop p1:

t = f;

if t < l then

  (print numbers[t]);

  t = t + n;

else goto ...

goto p1

如果n為負值(偽代碼):

loop p1:

t = f;

if t > l  then

  (print numbers[t]);

  t = t + n;

else goto ...

goto p1

 

序列的相加和乘法

通過使用加號可以進行數列的連接操作:

用過數字x乘以一個序列,會產生一個新序列,原來的序列將被重復x次;

例:

01(62)

如果要初始化一個空列表,可以使用Python內建值:None,例:

01(63)

例:讀取用戶輸入的一條信息,然后再屏幕上橫向居中顯示一個矩形,矩形中間顯示剛才輸入的信息;

代碼:

01(64)

運行結果:

01-1

這里的screen_width = 102 是我的屏幕寬度,矩形的寬度比文字寬度大6,每邊多3個位置,用來排版的;

 

成員資格

為了檢查一個值是否在序列中,可以使用in運算符,這個運算符檢測某個條件是否為真,然后返回相應的值,例:

01(65)

最后是檢查字符串,字符串最小的單位是字符,所以檢測'$$'和空格都能查到(只要是連續的字符),但是查找'空格+!'是查不到的;

再看一個例子:查看輸入的用戶名和PIN號碼是否存在數據列表中;

代碼:

01(66)

運行結果:

01-1(1)

 

長度、最小值和最大值


len函數返回序列中包含元素的數量;

min和max函數分別返回序列中最大和最小的元素;

例:

01(67)

 

列表


list函數

因為字符串不能像列表一樣被修改,所以有時候根據字符串創建列表會很有用:

01(68)


基本的列表操作

 

  • 元素賦值

使用索引標記來為某個特定的元素賦值,例:

01(69)

 

  • 刪除元素

使用del語句實現,例:

01(70)

 

  • 分片賦值

例:

01(71)

01-1(2)

numbers[1:1] = [2, 3, 4] 用來在索引1的位置插入幾個數;

 

列表方法

 

  • append

用於在列表尾部追加新對象,例:

01(72)


  • count

統計某個元素在列表中出現的次數,例:

01(73)


  • extend

在列表末尾追加另一個序列中的多個值,例:

01(74)

extend和字符串連接符+的區別是,+並不會修改原來的某個列表,而是創建一個副本存儲新列表,另外也可以使用a[len(a):] = b的方式擴展列表a,不過可讀性不如使用extend函數;

 

  • index

用於找出某個值的第一個匹配索引位置,例:

01(75)

如果未找到,觸發一個異常;

 

  • insert

將對象插入到列表中,例:

01(76)

insert方法不會替換原有數據,它可以在指定位置添加對象,insert的方法也可以用分片賦值來實現,不過可讀性不強;

 

  • pop

該方法會移除列表中的一個元素(默認是最后一個),並且返回該元素的值,例:

01(77)

pop()方法會修改原有列表,pop()方法會移除一個元素;

使用pop可以實現常見的數據結構:棧,即:后進先出LIFO;在Python中沒有所謂的入棧(push)方法,但是可以使用append方法來代替,例:

01(78)

如果要實現先進后出(FIFO),可以使用insert(0,x)代替append方法,這里意思每次在序列最前端插入數據,每次pop()的數據就是最先存入的數據;或者繼續使用append,但必須使用pop(0)來代替pop(),這里的表示,依然使用append在列表后面添加數據,但是pop(0)則是每次在列表最前端彈出數據,也就實現了最先存入的數據先被取出,例:

01(79)

不過最好的解決方案是使用collection模塊中的deque對象;

 

  • remove

用於移除列表中某個值的第一個匹配項,例:

01(80)

值得注意的是,remove()是一個沒有返回值的方法;

 

  • reverse

將列表中的元素反向存放,例:

01(81)

reverse()方法並不返回值,如果要對一個列表反向迭代(並不修改原來列表),可以使用reversed()函數,它返回一個迭代器(iterator)對象,然后使用list()函數可把返回的對象轉換成列表;


  • sort

對列表進行排序,這個排序結果是直接保存在原列表的(2.3版以前不修改原序列,而是返回一個副本),例:

01(82)


如果要保存原來的列表,可以這樣:

01(83)

不要執行類似如下的操作:

01(84)

sort()方法在2.3版本后直接修改原有列表,而且它並不返回值;

還要注意,不要使用y =  x,進行列表賦值,來保存原有列表,這是沒用的,它實際會讓他們指向同一個列表(地址),因為傳遞的是指針,例:

01(85)

另外,可以使用sorted()函數獲取已排序的列表副本,例:

01(86)

它會返回一個已排序的列表,而不會去修改原有列表;

 

  • 高級排序

如果希望元素按照特定方式排序,可以通過compare(x, y)的形式自定義比較函數,compare(x, y)函數會在x > y時返回1,x < y時返回-1,x = y時返回0,內建函數cmp(),提供了比較函數的默認實現方式,例:

01(87)

關鍵字參數key,可以指定關鍵字進行排序,如果要按元素長度排序可以,可以指定key=len,例:

01(88)

int型不存在長度對比,他都是根據系統平台來說的:16/32位;

另一個關鍵字參數reverse是簡單的布爾值,用來判斷是否進行反向排序,例:

01(89)

 

元組:不可變序列


元組與列表一樣,也是一種序列,唯一不同是元組不能修改(字符串也是如此),創建元組的語法很簡單:如果用逗號分隔了一些值,那么就自動創建了元組,例:

01(90)

要創建一個元素的元組,可以逗號后面什么都不加,空元組直接寫()即可,另外注意長度為1的元組和非元組的區別;

 

tuple函數


把一個序列轉換為元組,類似list()把序列轉換為列表,如果參數就是元組,那么就會被原樣返回,例:

01(91)

元組也可以進行分片操作;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM