序列概覽
在Python中有六種內建的序列:列表、元組、字符串、Unicode字符串、buffer對象和xrange對象。在這里暫時只討論列表和元組。列表和元組的主要區別在於:列表可以修改,元組(不可變)不能。
1. 通用序列操作
所有的序列都可以進行某些特定的操作。這些操作包括:
- 索引(indexing)
- 分片(sliceing)
- 加(adding)
- 乘(multiplying)
- 檢查某個元素是否屬於這序列(index)
- 計算序列長度(len)
- 找出最大元素和最小元素(min/max)
1.1 索引
序列中所有元素都是有編號的,索引從0
開始遞增。使用負數索引時,Python會從右邊開始計數(-1指的是序列最右邊的元素)
1 # -- coding: utf-8 -- 2 fruit = 'apple' 3 # 輸出:a 4 print fruit[0] 5 # 輸出:e 6 print fruit[-1]
1.2 分片
除了可以使用索引訪問當個元素,還可以使用分片操作來訪問一定范圍內元素。分片操作需要兩個索引來作為邊界,第一個索引的元素是包含在分片內的,而第二個則不包含(這是Python的慣例)。
1 # -- coding: utf-8 -- 2 numbers = [1,2,3,4,5,6,7,8,9,10] 3 4 # 輸出:[4, 5, 6] 5 print numbers[3:6] 6 7 # 輸出:[2, 3, 4, 5] 8 print numbers[1:-5]
1.2.1 序列分片語法糖
分片中的第二個索引是不包含在返回的分片內的,如果我們需要將一個序列最后的元素包含在分片中該如何操作呢?很簡單:
1 # -- coding: utf-8 -- 2 numbers = [1,2,3,4,5,6,7,8,9,10] 3 4 # 輸出:[8, 9, 10] 5 # 注意:序列中最大的索引為9,而分片中的第二個索引為10 6 print numbers[7:10]
Python同時為提供了為序列進行分片的語法糖,如下示例:獲取最后3位元素:
1 # -- coding: utf-8 -- 2 numbers = [1,2,3,4,5,6,7,8,9,10] 3 4 # 輸出:[8, 9, 10] 5 print numbers[-3:]
獲取序列前3個元素:
1 # -- coding: utf-8 -- 2 numbers = [1,2,3,4,5,6,7,8,9,10] 3 4 # 輸出:[1, 2, 3] 5 print numbers[:3]
獲取整個序列:
1 # -- coding: utf-8 -- 2 numbers = [1,2,3,4,5,6,7,8,9,10] 3 4 # 輸出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 5 print numbers[:]
1.2.2 分片中的步長
在進行分片的時候開始和結束點需要進行指定(顯式或隱式)。而另一個參數——步長(setp length)通常都是隱式設置的,默認值為1。如果步長為1:分片操作就是按照這個步長逐個遍歷序列的元素,然后返回開始和結束點之間的所有元素。例 如,下面兩個表達式輸出的值相等:
1 # -- coding: utf-8 -- 2 numbers = [1,2,3,4,5,6,7,8,9,10] 3 4 # 輸出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 5 print numbers[0:10:1] 6 7 # 輸出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 8 print numbers[0:10]
步長也支持下面的簡寫形式:
1 # -- coding: utf-8 -- 2 numbers = [1,2,3,4,5,6,7,8,9,10] 3 4 # 輸出:[1, 5, 9] 5 print numbers[::4]
步長不能為0,但是可以為負數 —— 即從右到左提取元素。使用一個負數作為步長時,必須讓開始點(開始索引)大於結束點。如下:
1 # -- coding: utf-8 -- 2 numbers = [1,2,3,4,5,6,7,8,9,10] 3 4 # 輸出:[7, 6, 5] 5 print numbers[6:3:-1] 6 7 # 輸出:[10, 8, 6, 4, 2] 8 print numbers[::-2] 9 10 # 輸出:[6, 4, 2] 11 print numbers[5::-2] 12 13 # 輸出:[10, 8] 14 print numbers[:5:-2]
1.3 序列相加
可以使用加號對兩個類型相同的序列進行連接操作,如下:
1 # -- coding: utf-8 -- 2 numbers1 = [1,2,3] 3 numbers2 = [4,5,6] 4 5 # 輸出:[1, 2, 3, 4, 5, 6] 6 print numbers1 + numbers2
1.4 乘法
使用數字n乘以一個序列會生成新的序列,在新的序列中,原來的序列將被重復n次。初始化一個長度為10的列表,每個元素的值為None(None為Python內建值,表示:這里什么也沒有)可以這樣:
1 # -- coding: utf-8 -- 2 sequence = [None] * 10 3 4 # 輸出:[None, None, None, None, None, None, None, None, None, None] 5 print sequence
1.5 成員資格
可以使用in
運算符判斷一個對象是否為某個序列的成(元素),如下:
1 # --- coding:utf-8 --- 2 permissions = 'rw' 3 fruits = ['apple','peach','grape'] 4 5 # 輸出:True 6 print 'w' in permissions 7 8 # 輸出:True 9 print 'apple' in fruits 10 11 # 輸出:False 12 print 'orange' in fruits
1.6 長度、最小值和最大值
Python的內建函數:len/min/max
的作用分別是:返回序列中包含元素的數量,返回序列中最小和最大元素。如下:
1 # -- coding: utf-8 -- 2 numbers = [-1,21,89] 3 4 # 輸出:3 5 print len(numbers) 6 7 # 輸出:-1 8 print min(numbers) 9 10 # 輸出:89 11 print max(numbers)
2. 列表
列表是可變的(mutable),且提供很多有用的函數。
2.1 list函數
通過使用list函數可以將字符串轉換為一個序列。(注意:list函數適用於所有類型的序列,而不只是字符串),如下:
1 # -- coding: utf-8 -- 2 python = list('python') 3 4 # 輸出:['p', 'y', 't', 'h', 'o', 'n'] 5 print python
2.2 基本的列表操作
列表可以使用所有適用於序列的標准操作,如索引、分片、連接和乘法。
改變列表:元素賦值
1 # --- coding: utf-8 --- 2 x = [1,1,1] 3 4 # 改變索引1元素的值 5 x[1] = 2 6 7 # 輸出2 8 print x[1]
刪除元素
1 # -- coding: utf-8 -- 2 fruits = ['apple','orange','banana'] 3 4 # 使用del語句刪除元素 5 del fruits[1] 6 7 # 輸出:['apple', 'banana'] 8 print fruits
分片賦值
通過分片賦值可以:一次為多個元素賦值、插入元素、刪除元素,如下:
1 # -- coding: utf-8 -- 2 name = list('perl') 3 # 輸出:['p', 'e', 'r', 'l'] 4 print name 5 6 # 一次為多個元素賦值 7 name[2:] = list('ar') 8 9 # 輸出:['p', 'e', 'a', 'r'] 10 print name 11 12 # 通過分片賦值插入元素 13 numbers = [1,5] 14 numbers[1:1] = [2,3,4] 15 16 # 輸出:[1, 2, 3, 4, 5] 17 print numbers 18 19 #通過分片賦值刪除元素 20 numbers[1:4] = [] 21 22 # 輸出:[1, 5] 23 print numbers
2.3 列表方法
更多列表的使用方法和API,請參考Python文檔:http://docs.python.org/2/library/functions.html#list
append
:用於在列表末尾追加新對象:
1 # -- coding: utf-8 -- 2 3 # append函數 4 lst = [1,2,3] 5 lst.append(4) 6 # 輸出:[1, 2, 3, 4] 7 print lst
count
:用於統計某個元素在列表中出現的次數:
1 # count函數 2 temp_str = ['to','be','not','to','be'] 3 # 輸出:2 4 print temp_str.count('to')
extend
:可以在列表末尾一次性追加另一個序列中的多個值,和連接操作不同,extend方法是修改了被擴展的序列(調用extend方法的序列),而原始的連接操作返回的是一個全新的列表
1 # extend函數 2 a = [1,2,3] 3 b = [4,5,6] 4 a.extend(b) 5 #輸出:[1, 2, 3, 4, 5, 6] 6 print a 7 # 輸出:[1, 2, 3, 4, 5, 6, 7, 8, 9] 8 print a + [7,8,9] 9 # 輸出:[1, 2, 3, 4, 5, 6] 10 print a
index
:用於從列表中找出某個值第一個匹配項的索引位置
1 # index函數 2 knights = ['we','are','the','knights','who','say','ni'] 3 # 輸出:4 4 print knights.index('who') 5 # 拋出異常:ValueError: 'me' is not in list 6 print knights.index('me')
insert
:用於將對象插入到列表中
1 # insert函數 2 numbers = [1,2,3,5,6] 3 numbers.insert(3,'four') 4 # 輸出:[1, 2, 3, 'four', 5, 6] 5 print numbers
pop
:移除列表中的一個元素(默認是最后一個),並且返回該元素的值。通過pop方法可以實現一種常見的數據結構——棧(LIFO,后進先出)。
1 # pop函數 2 x = [1,2,3] 3 x.pop() 4 # 輸出:[1, 2] 5 print x 6 y = x.pop(0) 7 # 輸出:[2] 8 print x 9 # 輸出:1 10 print y
remove
:移除列表中某個值的第一個匹配項
1 # remove函數 2 x = ['to','be','not','to','be'] 3 x.remove('to') 4 # 輸出:['be', 'not', 'to', 'be'] 5 print x 6 # 移除列表沒有的元素會拋出異常 7 x.remove('too')
reverse
:將列表中的元素反向存放
1 # reverse函數 2 x = [1,2,3] 3 x.reverse() 4 # 輸出:[3, 2, 1] 5 print x
sort
:對列表進行排序。注意:sort函數時沒有返回值的(None),它作用於源序列。可以通過sorted函數
來獲取已排序的列表副本。
1 # sort函數 2 x = [3,1,2,7,6,9,5,4,8] 3 y = x[:] 4 z = x 5 y.sort() 6 # 輸出:[3, 1, 2, 7, 6, 9, 5, 4, 8] 7 print x 8 # 輸出:[1, 2, 3, 4, 5, 6, 7, 8, 9] 9 print y 10 # 輸出:[3, 1, 2, 7, 6, 9, 5, 4, 8] 11 print z
cmp(x,y)
:通過自定義比較函數(compare),可以實現自定義排序
3. 元組:不可變序列
元組和列表最大的區別在於:元組不能修改。
3.1 創建元組
創建元組很簡單,只需要將元素用括號(可選)括起來,並使用逗號分隔符(即使只有一個元素)來分隔各個元素即可:
1 # -- coding: utf-8 -- 2 fruits = ('apple','orange','banana') 3 none_tuple = () 4 fruits_1 =('apple',) 5 6 # 輸出:<type 'tuple'> 7 print type(fruits) 8 print type(none_tuple) 9 print type(fruits_1)
3.2 使用tuple函數
通過tuple函數可以將一個序列轉換為元組。如下:
1 # -- coding: utf-8 -- 2 temp_tuple = tuple([1,2,3]) 3 4 # 輸出:(1, 2, 3) 5 print temp_tuple 6 # 輸出:('a', 'b', 'c') 7 print tuple('abc')
3.3 基本元組操作
由於元組是不可變的,所有沒有提供像列表一樣的函數,基本元組操作就是創建和訪問。同樣,元組作為序列的一種,也支持分片:
1 # -- coding: utf-8 -- 2 temp_tuple = tuple([1,2,3]) 3 4 # 輸出:1 5 print temp_tuple[0] 6 # 輸出:(1, 2) 7 print temp_tuple[0:2]
3.4 那些地方需要使用元組
- 元組可以在映射(和集合的成員)中作為鍵(key)使用,而列表不行
- 元組作為很多內建函數和方法的返回值存在