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、 意義何在?
①元組可以在映射(和集合的成員)中當作鍵使用,而列表不行
②元組作爲很多內建函數和方法的返回值存在。