- Python算法設計與分析從入門到精通
- 明日科技編著
- 4976字
- 2022-07-28 18:54:32
3.3 列表與元組
列表是Python中內置的可變序列,由一系列按特定順序排列的元素組成。列表的所有元素都放在一對中括號“[ ]”中,相鄰元素間使用英文逗號“,”分隔。整數、實數、字符串、列表、元組等任何類型的內容都可以放入列表中,且同一個列表中元素的類型可以不同,因為它們之間沒有任何關系。由此可見,Python中的列表是非常靈活的,這一點與其他語言是不同的。
3.3.1 列表的創建
在Python中提供了多種創建列表的方法,下面分別進行介紹。
1.使用賦值運算符直接創建列表
創建列表時,也可以使用賦值運算符“=”直接將一個列表賦值給變量。語法格式如下:
listname = [element 1,element 2,…,element n]
參數說明:
listname:列表名稱,可以是任何符合Python命名規則的標識符。
elemnet 1,elemnet 2,…,elemnet n:列表中的元素,個數沒有限制,只要是Python支持的數據類型就可以。
例如,下面定義的都是合法的列表。
01 num = [7,14,21,28,35,42,49,56,63] 02 verse = ["自古逢秋悲寂寥","我言秋日勝春朝","晴空一鶴排云上","便引詩情到碧霄"] 03 untitle = ['Python',28,"人生苦短,我用Python",["爬蟲","自動化運維","云計算","Web開發"]] 04 python = ['優雅',"明確",'''簡單''']
說明
雖然可以將不同類型的數據放在同一個列表中,但通常情況下不這樣做。建議大家一個列表只放入一種類型的數據,這樣可以提高程序的可讀性。
2.創建空列表
在Python中可以創建空列表。例如,創建一個名稱為emptylist的空列表,代碼如下:
emptylist = []
3.創建數值列表
數值列表很常見,創建數值列表需要使用list()函數。例如,在考試系統中記錄學生的成績,或者在游戲中記錄每個角色的位置、各個玩家的得分等,都可以應用數值列表來保存對應的數據。
list()函數的基本語法格式如下:
list(data)
其中,data是可以轉換為列表的數據,類型可以是range對象、字符串、元組或其他可迭代類型。
例如,創建一個10~20(不包括20)范圍所有偶數的列表,可以使用下面的代碼:
list(range(10, 20, 2)) #10~20(不包括20)范圍所有偶數的列表
運行上面的代碼后,將得到下面的列表:
[10, 12, 14, 16, 18]
說明
使用list()函數不僅能通過range對象創建列表,還可以通過其他對象創建列表。
3.3.2 檢測列表元素
在Python中,可以直接使用print()函數輸出列表的內容。例如,要打印上面創建的untitle列表,可以使用下面的代碼:
print(untitle)
運行結果如下:
['Python', 28, '人生苦短,我用Python', ['爬蟲', '自動化運維', '云計算', 'Web開發', '游戲']]
可以看出,輸出列表時會包括左右兩側的中括號。如果不想輸出全部元素,可通過列表索引獲取指定的元素。例如,要獲取列表untitle中索引為2的元素,可以使用下面的代碼:
print(untitle[2])
運行結果如下:
人生苦短,我用Python
從上面的運行結果中可以看出,輸出單個列表元素時,不包括中括號;如果是字符串,不包括左右的引號。
3.3.3 列表的截取—切片
列表的截取就是切片操作,它可以訪問一定范圍內的元素,并通過切片操作生成一個新的序列。實現切片操作的語法格式如下:
sname[start : end : step]
參數說明:
sname:序列的名稱。
start:切片的開始位置(包括該位置)。如果不指定,則默認為0。
end:切片的截止位置(不包括該位置)。如果不指定,則默認為序列的長度。
step:切片的步長。如果省略,則默認為1。當省略該步長時,最后一個冒號也要省略。
說明
進行切片操作時,如果指定了步長,將按照該步長遍歷序列中的元素,否則將逐個元素地遍歷序列。
例如,通過切片獲取熱門綜藝名稱列表中的第2~5個元素,以及獲取第1個、第3個和第5個元素,可以使用下面的代碼。

運行上面的代碼,將輸出以下內容:
['歌手', '中國好聲音', '巧手神探', '歡樂喜劇人'] ['向往的生活', '中國好聲音', '歡樂喜劇人']
說明
要想復制整個序列,可以將start和end參數都省略,但中間的冒號需要保留。例如,verse[:]表示復制verse列表中的整個序列。
3.3.4 列表的拼接
在Python中,支持兩種相同類型列表的相加操作。這里,“相加”的含義是將兩個列表拼接起來,使用加號運算符“+”來實現。例如,將兩個列表相加,可以使用下面的代碼。

運行上面的代碼,將輸出以下內容:
['快樂大本營', '天天向上', '中餐廳', '跨界喜劇王', '向往的生活', '歌手', '中國好聲音', '巧手神探', '歡樂喜劇人', '笑傲 江湖', '奔跑吧', '王牌對王牌', '吐槽大會', '奇葩說']
從輸出結果可以看出,兩個列表被合并為一個列表了。
說明
進行序列相加時,相同類型的序列是指同為列表、元組、集合等,序列中的元素類型可以不同。例如,下面的代碼也是正確的:
01 num = [7,14,21,28,35,42,49,56] 02 art = ["快樂大本營","天天向上","中餐廳","跨界喜劇王"] 03 print(num + art)
相加后的結果如下:
[7, 14, 21, 28, 35, 42, 49, 56, '快樂大本營', '天天向上', '中餐廳', '跨界喜劇王']
但不能是列表和元組相加,或者列表和字符串相加。例如,下面的代碼就是錯誤的:
01 num = [7,14,21,28,35,42,49,56,63] 02 print(num + "輸出是7的倍數的數")
上面的代碼運行后將產生如圖3.42所示的異常信息。

圖3.42 將列表和字符串相加產生的異常信息
3.3.5 遍歷列表
有時候,我們需要遍歷列表中的所有元素,以實現查詢、修改、刪除等功能。在Python中遍歷列表的方法有多種,下面介紹兩種常用的方法。
1.使用for循環遍歷列表
直接使用for循環遍歷列表,并輸出元素的值,語法格式如下:

參數說明:
item:用于保存獲取到的元素值。輸出元素內容時,直接輸出該變量即可。
listname:列表的名稱。
【實例3.16】 輸出熱門綜藝的名稱。(實例位置:資源包\Code\03\16)
定義一個保存熱門綜藝名稱的列表,然后通過for循環遍歷該列表,并輸出各綜藝的名稱。具體代碼如下:

運行上面的代碼,結果如圖3.43所示。
2.使用for循環和enumerate()函數遍歷列表
使用for循環和enumerate()函數遍歷列表,可以同時輸出索引值和對應的元素內容。語法格式如下:
for index,item in enumerate(listname): #遍歷列表listname的每一項 print(index,item) #輸出index和item
參數說明:
index:用于保存元素的索引。
item:用于保存獲取到的元素值。輸出元素內容時,直接輸出該變量即可。
listname:列表的名稱。
例如,定義一個保存熱門綜藝名稱的列表,然后通過for循環和enumerate()函數遍歷該列表,并輸出索引和綜藝名稱,代碼如下:

執行上面的代碼,將顯示下面的結果。
熱門綜藝名稱: 1 向往的生活 2 歌手 3 中國好聲音 4 巧手神探 5 歡樂喜劇人 6 笑傲江湖 7 奔跑吧 8 王牌對王牌 9 吐槽大會 10 奇葩說
如果想實現分兩列(兩個綜藝一行)輸出熱門綜藝名稱,請看下面的實例。
【實例3.17】 分兩列輸出熱門綜藝名稱。(實例位置:資源包\Code\03\17)
創建一個文件,在該文件中先輸出標題,然后定義一個列表(保存綜藝名稱),再應用for循環和enumerate()函數遍歷列表,在循環體中通過if…else語句判斷是否為偶數,如果為偶數則不換行輸出,否則換行輸出。具體代碼如下:

說明
上面的代碼中,print()函數中使用“, end=''”表示不換行輸出,即下一條print()函數的輸出內容會和這條內容在同一行輸出。
運行結果如圖3.44所示。

圖3.43 通過for循環遍歷列表

圖3.44 分兩列顯示熱門綜藝名稱
3.3.6 列表排序
在實際開發時,經常需要對列表進行排序。Python中提供了兩種常用的列表排序方法,下面分別進行介紹。
1.使用列表對象的sort()方法排序
使用列表對象的sort()方法,可對列表中的元素進行排序。排序后,原列表中的元素順序將發生改變。sort()方法的語法格式如下:
listname.sort(key=None, reverse=False)
參數說明:
listname:要進行排序的列表。
key:在指定列表中選擇一個用于比較的鍵。如果設置“key=str.lower”,表示在排序時不區分字母大小寫。
reverse:可選參數。其值為True,表示降序排列;為False,則表示升序排列。默認為升序排列。
例如,定義一個保存10名學生語文成績的列表,然后應用sort()方法對其進行排序,代碼如下:

執行上面的代碼,將顯示以下內容。
原列表: [98, 99, 97, 100, 100, 96, 94, 89, 95, 100] 升 序: [89, 94, 95, 96, 97, 98, 99, 100, 100, 100] 降 序: [100, 100, 100, 99, 98, 97, 96, 95, 94, 89]
使用sort()方法對數值列表進行排序比較簡單,但在對字符串列表進行排序時,采用的規則是先對大寫字母進行排序,然后再對小寫字母進行排序。如果不需要區分大小寫字母,需要指定參數key。例如,定義一個保存英文字符串的列表,然后應用sort()方法對其進行升序排列,可以使用下面的代碼。

運行上面的代碼,將顯示以下內容。
區分字母大小寫: ['Angela', 'Tom', 'cat', 'pet'] 不區分字母大小寫: ['Angela', 'cat', 'pet', 'Tom']
說明
sort()排序方法對于中文的支持不夠友好,排序的結果與我們常用的按拼音或者按筆畫排序都不一致。如果需要對中文內容的列表排序,還需要重新編寫排序方法,不能直接使用sort()方法。
2.使用內置的sorted()函數排序
使用內置的sorted()函數,也可以對列表進行排序。storted()函數的語法格式如下:
sorted(iterable, key=None, reverse=False)
參數說明:
iterable:要進行排序的列表名稱。
key:在指定列表中選擇一個用于比較的鍵。如果設置“key=str.lower”,表示在排序時不區分字母大小寫。
reverse:可選參數。其值為True,表示降序排列;為False,則表示升序排列。默認為升序排列。
例如,定義一個保存10名學生語文成績的列表,然后應用sorted()函數對其進行排序,代碼如下:

執行上面的代碼,將顯示以下內容。
升序: [89, 94, 95, 96, 97, 98, 99, 100, 100, 100] 降序: [100, 100, 100, 99, 98, 97, 96, 95, 94, 89] 原序列: [98, 99, 97, 100, 100, 96, 94, 89, 95, 100]
說明
列表對象的sort()方法和內置sorted()函數的作用基本相同,不同的是:使用sort()方法時,會改變原列表的元素排列順序;使用storted()函數時,會建立一個原列表的副本,該副本為排序后的列表。
3.3.7 元組
元組(tuple)是Python中另一個重要的序列結構。與列表類似,元組也由一系列按特定順序排列的元素組成,但卻是不可變序列。因此,元組也可以稱為不可變的列表。
形式上,元組的所有元素都放在一對小括號“()”中,相鄰元素間使用英文逗號“,”分隔。內容上,可以將整數、實數、字符串、列表、元組等任何類型的內容放入元組中,且同一個元組中元素的類型可以不同。通常情況下,元組用于保存程序中不可修改的內容。
1.元組的創建
在Python中提供了多種創建元組的方法,下面分別進行介紹。
1)使用賦值運算符直接創建元組
創建元組時,可以使用賦值運算符“=”直接將一個元組賦值給變量。語法格式如下:
tuplename = (element 1,element 2,…,element n)
參數說明:
tuplename:元組的名稱,可以是任何符合Python命名規則的標識符。
elemnet 1,elemnet 2,…,elemnet n:元組中的元素,個數沒有限制,只要是Python支持的數據類型就可以。
說明
元組的創建格式與列表類似,只是創建列表使用的是中括號“[]”,而創建元組使用的是小括號“()”。
例如,下面定義的都是合法的元組。
num = (7,14,21,28,35,42,49,56,63) ukguzheng = ("漁舟唱晚","高山流水","出水蓮","漢宮秋月") untitle = ('Python',28,("人生苦短","我用Python"),["爬蟲","自動化運維","云計算","Web開發"]) python = ('優雅',"明確",'''簡單''')
在Python中,雖然元組的標準格式是使用一對小括號將所有的元素括起來,但是實際上,小括號并不是必須的。只要將一組值用逗號分隔開來,就可以認為它是元組。例如,下面的代碼定義的也是元組。
ukguzheng = "漁舟唱晚","高山流水","出水蓮","漢宮秋月"
在IDLE中輸出該元組后,將顯示以下內容。
('漁舟唱晚', '高山流水', '出水蓮', '漢宮秋月')
如果要創建的元組中只包括一個元素,則需要在定義元組時在元素的后面加一個逗號“,”。例如,下面的代碼定義的就是包括一個元素的元組。
verse = ("一片冰心在玉壺",)
在IDLE中輸出verse,將顯示以下內容:
('一片冰心在玉壺',)
而下面的代碼,則表示定義一個字符串:
verse = ("一片冰心在玉壺")
在IDLE中輸出verse,將顯示以下內容:
一片冰心在玉壺
說明
在Python中,可以使用type()函數測試變量的類型。例如,有下面的代碼:
01 verse1 = ("一片冰心在玉壺",) 02 print("verse1的類型為",type(verse1)) 03 verse2 = ("一片冰心在玉壺") 04 print("verse2的類型為",type(verse2))
在IDLE中執行上面的代碼,將顯示以下內容。
verse1的類型為 <class 'tuple'> verse2的類型為 <class 'str'>
2)創建空元組
在Python中,也可以創建空元組,例如,要創建一個名稱為emptytuple的空元組,代碼如下:
emptytuple = ()
空元組可以應用在為函數傳遞一個空值或者返回空值時。例如,定義一個函數必須傳遞一個元組類型的值,而我們還不想為它傳遞一組數據,就可以創建一個空元組并傳遞給它。
3)創建數值元組
可以使用tuple()函數將一組數據轉換為元組,基本語法如下:
tuple(data)
其中,data表示可以轉換為元組的數據,其類型可以是range對象、字符串、元組或者其他可迭代類型的數據。
例如,創建一個10~20(不包括20)范圍所有偶數的元組,可以使用下面的代碼:
tuple(range(10, 20, 2))
運行上面的代碼后,將得到下面的元組:
(10, 12, 14, 16, 18)
說明
使用tuple()函數不僅能通過range對象創建元組,還可以通過其他對象創建元組。
2.訪問元組元素
在Python中,可以直接使用print()函數輸出元組的內容。例如,要想打印前面創建的untitle元組,可以使用下面的代碼:
print(untitle)
執行結果如下:
('Python', 28, ('人生苦短', '我用Python'), ['爬蟲', '自動化運維', '云計算', 'Web開發'])
從執行結果可以看出,輸出元組時包括左右兩側的小括號。如果不想輸出全部的元素,可通過元組索引來獲取指定的元素。例如,要獲取元組untitle中索引為0的元素,可以使用下面的代碼:
print(untitle[0])
執行結果如下:
Python
從執行結果可以看出,輸出單個元組元素時不包括小括號;如果是字符串,不包括左右的引號。
另外,對于元組也可以采用切片方式獲取指定的元素。例如,要訪問元組untitle中前3個元素,可以使用下面的代碼:
print(untitle[:3])
執行結果如下:
('Python', 28, ('人生苦短', '我用Python'))
同列表一樣,元組也可以使用for循環進行遍歷,方法不再贅述。