【循序漸進學Python】2. Python中的序列——列表和元組


序列概覽

在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)使用,而列表不行
  • 元組作為很多內建函數和方法的返回值存在

 

參考資料&進一步閱讀

《Python基礎教程》

Learn Python The Hard Way, 2nd Edition

http://www.pythondoc.com/pythontutorial27/index.html


免責聲明!

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



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