Python隨記(一)列表和元組

Python中最基本的數據結構就是序列了。Python一共包含6種內建序列:列表、元組、字符串、Unicode字符串、xrange對象、buffer對象。序列都可以進行的操作包括索引,切片,加,乘,檢查成員

 

本篇隨記先講兩個最基礎的序列:列表和元組。其實這兩個很像C++中的數組結構,但是有其本身的特點,各位學習的過程中可以自己聯想其中的共通性,但是不要搞混淆。

一、列表(List)

列表是最常用的Python數據類型,它可以作爲一個方括號內的逗號分隔值出現。

創建一個列表,只要把逗號分隔的不同的數據項使用方括號括起來即可。如下所示:

List1 = [1, 2, 3, 4, 5 ];

List2 = [‘a’ , ’b’ , ’c’ ,’d’ , ’e’ , ’f’ ];

列表的數據項不需要具有相同的類型:

List3 = ['A', 'B', 1, 2];

這三個List作爲例子下文會用到。。。

 

1、 索引(indexing)

序列中的所有元素都是有標號的,和其他很多語言一樣,是從0開始的

可以通過索引來訪問列表中的某個元素,如List3[0]的值就是‘A’,

索引可以爲負數,但是最後一個元素的索引對應的是-1,只有正序第一個元素的索引爲0

2、 分片(sliding)

分片操作用來訪問一定範圍內的元素,分片通過冒號隔開的兩個索引實現。這兩個索引作爲邊界,第1個索引包含在分片內,第2個索引是剩下的元素中的第一個元素的索引。比如List[m : k+1]其實是指的是索引爲 m~k這個區間的元素。

以上文中提到的三個List來舉例哈:

①  普通情況:

如List2[1: 4]=[‘b’, ‘c’, ‘d’]

List2[0: 6] =[‘a’, ’b’ , ’c’ ,’d’ , ’e’ , ’f’ ];,雖然我們的索引其實只是0到5,但是這裏第二個邊界寫6是可以的,因爲只取到索引爲(6-1)的這個元素爲止,並沒有超出List2的大小。

②這裏的索引同樣可以爲負數:

List2[-4 : - 1] = [‘c’, ‘d’, ‘e’],注意這裏第二個邊界雖然寫的是-1,但是同樣是不能把索引爲 -1的這個元素包含進去的,那麼我現在想把最後一個元素也包含進去該怎樣做?

List2[ -4:  ] = [‘c’, ‘d’, ‘e’, ‘f’],就是說直接把第二個邊界空着,它就會一直包含到底。

③其他步長的情況:

其實在分片時,不止可以提供兩個邊界,還可以提供第三個參數,步長。前面不寫,程序就是用的默認步長:+1.

List2[0: 6,2] =[‘a’ , ’c’ , ’e’ ] 

這裏步長爲2,所以取的其實就是List2[0]、List2[0+2]、List2[0+2*2]這三個元素。

④逆序(步長爲負數)

前面的三種情況,我們輸出的列表的元素的順序和原來列表的順序是一致的,因爲默認的步長是+1!其實也可以倒着輸出,這時候把步長設置爲負數就好。注意,步長爲負數時,第一個邊界對應的索引應該比第二個邊界大,這樣才能倒着輸出:

List2[6:0,-1] =[‘f’, ‘e’, ‘d’, ‘c’, ‘b’, ‘a’];

注意,此處來個對比:

List2[0:6, 2] =[‘a’ , ’c’ , ’e’ ]

List2[6:0,-2] =[‘f’ , ’d’ , ’b’ ]

一個是正序,一個是逆序,只不過步長的絕對值是2,這樣能看出區別來,不要以爲逆序就是簡單的把正序給倒過來而已。

List2[0:6, 2]取的其實就是List2[0]、List2[0+2]、List2[0+2*2]這三個元素!

List2[6:0,-2]取的是List2[5]、List2[5-2]、List2[5-2*2]這三個元素!爲什麼這樣呢,因爲倒序時,我的第一個邊界其實就是剛纔正序時的尾邊界,所以仍然要執行減一這個操作!

 

3、 序列相加

這一步其實很像C++中字符串string類的操作,就是兩個相同類型的序列相加之後得到一個新序列。何謂相同類型,就是我最開始說的序列包含6個種類,(一定不要把序列(Sequence)和列表(List)搞混啊,列表只是序列的一種,序列是個大概念),相同種類的序列才能相加。

 

4、 乘法

用數字K乘以一個序列會生成一個新的序列,而新的序列中,原來的元素將會被重複K次。

空列表:[ ]

如果想要構造一個佔K個元素空間的空列表,可以有[None] * K。

 

5、 成員資格

檢查一個值是否在列表中,可以使用in運算符。返回值爲false或者true。

 

6、 列表的一些基本操作

①賦值和分片賦值(太簡單不講了)

 這裏有個點要注意!!!:

如果已有一個列表List1,使用賦值 y=List1,         其實並沒有新創建一個列表。

這樣的操作使得y和List1指向同一個列表,有點C++中引用的意思。

正確的給新的列表的賦值的方式是 y = [ : ],這樣就得到一個新的列表且元素和y一模一樣了。

②刪除元素:就是用del語句實現(delete的前三個字母)

 

7、 基本的列表方法

①append,用於在列表末尾追加新的對象(其實append的英文意思就是添加)

List1 = [1, 2, 3, 4, 5 ];

List1.append(9)

List1= [1, 2, 3, 4, 5, 9 ]

count方法統計某個元素在列表中出現的次數,返回值就是次數

extend,在列表的末尾一次性追加另一個序列中的多個值。就是可以用新列表擴展原有列表。

List1 = [1, 2, 3, 4, 5 ];

List2 = [‘a’ , ’b’ , ’c’ ,’d’ , ’e’ , ’f’ ];

List1.extend( List2)

List1 =  [1, 2, 3, 4, 5, ‘a’ ,’b’ , ’c’ ,’d’ , ’e’ , ’f’ ];

看起來很像加法,實則不然!這個操作中,List1的值已經更新了,是對List1的操作。而加法運算,兩個序列相加後,原來的兩個序列還在,沒變,產生的新的序列佔用的是新開闢的內存空間。

 

 ④index 用於從列表中找出某個值第一個匹配項的索引位置

 ⑤insert 用於將對象插入到列表

List1 = [1, 2, 3, 4, 5 ]

List1. Insert(3,‘A’)

List1 = [1, 2, 3, ‘A’, 4, 5 ]

可見把原來索引爲3的元素4以及後面的元素5都依次後移,然後在索引爲3的位置插入了新的元素。

⑥pop    移除列表的一個元素,默認是最後一個。它是惟一一個既返回數值,且同時修改原列表的列表方法。

List1.pop( )   默認移除最後一個元素

List1.pop(2)  移除索引爲2的元素,是以索引爲參考

⑦remove 移除列表中某個值的第一個匹配項

  個人感覺這個操作相當於,先用index找出你要的找的這個元素的索引,然後我用pop( )方法去移除這個索引位置的元素。現在這兩個操作融合到一起,就成了remove(這是我自己的感覺,有錯誤還請指正0-0),直接找元素然後刪元素。

⑧reverse  將列表中的元素反向存放

⑨sort    用於在原位置對列表進行排序,意味着也是要改變原來的列表而不是簡單的返回一個副本而已。

  如果你想既要有原來的列表,又要有換序後的列表.有兩種操作方法,

A、y=List1[ : ]

y.sort( )

這樣List1還在,而y是換序後的列表

B、 使用sorted 函數

Y = sorted ( List1)

 

二、元組(Tuple)

元組與列表一樣,也是一種序列。唯一的不同是元組不能修改(字符串同樣也不能修改)

1、  創建元組

如果用逗號分隔開了一些值,那麼就自動創建了元組。

如:輸入 2,3,4

得到(2,3,4)

元組大部分時間是通過圓括號括起來的。

注意,如果要創建一個只有一個元素的元組,同樣要添加逗號。

>>>123

123

>>>123,

(123,)

>>>(123,)

(123,)

2、  元組和列表的相互轉化

list()函數將元組轉化爲列表

輸入list( (1, 3, 5, 7) )

就等於[1, 3, 5, 7]

 

,tuple函數將列表轉化爲元組

輸入tuple( [2, 4, 6, 8] )

就得到 (2, 4, 6, 8)

 

3、  元組操作,

因爲元組不可變,所以其實基本上就是創建和訪問元組這些操作,沒有像列表那麼多的操作。

訪問通過索引方式訪問,分片也一樣的操作。

 

4、  意義何在?

①元組可以在映射(和集合的成員)中當作鍵使用,而列表不行

②元組作爲很多內建函數和方法的返回值存在。

 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章