Python的基本資料類型有整數,浮點數,布爾,字元串,它們是最基本的資料。在實際程式設計中,我們要經常組織由很多基本資料組成的集合,這些集合的不同組織方式就是:資料結構,今天講的是資料結構中的Python list(清單)。資料結構就是一些資料組合得到的“複合”資料類型。
Python内置的資料結構有:
- 清單(list)
- 元組(tuple)
- 字典(dict)
- 集合(set)
在Python語言中,以上4種資料結構和基礎資料類型(整數、浮點數等)統稱為“内置類型”(Built-in Types)。
Python list(清單)
Python list(清單),是Python中最常用的一種資料結構,它是一組用方括号括起來、逗号分隔的資料。清單的元素可以是任何類型的,但使用時通常各個元素的類型是相同的。下面的清單有5個元素,元素類型分别是字元串、整數、浮點數和清單:
In [15]: list_a = ['a', 'b', 3, 8.9, [1,2]]In [16]: list_aOut[16]: ['a', 'b', 3, 8.9, [1, 2]]
list(清單)的索引(index)
清單就像一個叫号排隊的隊伍,從頭到尾每個元素都有一個遞增的号碼,這個号碼就是對應元素的“索引”(index)。與我們生活中不同的是,清單的第一進制素的索引是0。
In [22]: list_a[0]Out[22]: 'a'In [23]: list_a[1]Out[23]: 'b'In [24]: list_a[3]Out[24]: 8.9
清單這個隊伍也可以從隊尾往前叫号,也就是倒序叫号,這時候索引都是負的(負索引),隊尾元素的索引s是-1,倒數第二個是-2,依次向前遞減。
In [25]: list_a[-1]Out[25]: [1, 2]In [26]: list_a[-2]Out[26]: 8.9
Python清單的索引可以是正索引(從頭到尾),也可以是負索引(從尾到頭),總結為下面的關系:
清單: ['a', 'b', 'c', 'd', 'e'] | | | | |正索引: 0 1 2 3 4負索引: -5 -4 -3 -2 -1
通過索引我們可以通路到某個元素,那麼我們就可以修改這個元素。沒錯,清單裡面的元素是可以被修改的,相當于你先替别人排了個隊,他來了就把你替換了。
In [31]: list_b = ['a', 'b', 'c']In [32]: list_b[1] = 2In [33]: list_bOut[33]: ['a', 2, 'c']
list(清單)的切片(slicing)
通過索引,我們可以通路list(清單)的單個元素。但有時候我們要取清單的一個片段,這就是“切片”操作。切片傳回的是一個清單,可以了解為“子清單”。
切片是通過索引來實作的,比如: list_a[1:3],這裡索引變成兩個用冒号:分隔,分别是切片的開始索引和結束索引,[1:3]代表的是一個左開右閉區間,即包含左邊索引的元素,到右邊索引為止但不包括該元素。那麼list_a[1:3]得到的是['b', 3]:
In [27]: list_a[1:3]Out[27]: ['b', 3]In [28]: list_a[:3]Out[28]: ['a', 'b', 3]In [29]: list_a[1:]Out[29]: ['b', 3, 8.9, [1, 2]]In [30]: list_a[:]Out[30]: ['a', 'b', 3, 8.9, [1, 2]]
上面例子中,切片範圍的起止索引可以是缺失的,左邊缺失就是從頭(0)開始,右邊缺失就是後面的全部。
list運算符
清單作為Python的一種“内置類型”,它也像基本類型數字、字元串那樣可以進行一些運算符的運算,如下表所示:
從頭到尾周遊(疊代)一個list的文法是:for x in list:
for x in [1, 2, 3]: print(x)
删除list(清單)
(1)删除整個清單
In [35]: list_a = ['a', 'b', 3, 8.9, [1,2]]In [36]: del list_aIn [37]: list_a---------------------------------------------------------------------------NameError Traceback (most recent call last) in ----> 1 list_aNameError: name 'list_a' is not defined
del是Python的一個保留關鍵字,用于删除(delete)對象。Python裡面的所有東西都是對象,所有del可以用于删除變量、清單等等。
(2)删除清單的一個或多個元素
In [41]: list_a = ['a', 'b', 3, 8.9, [1,2]]In [42]: del list_a[0] # 删除一個元素In [43]: list_aOut[43]: ['b', 3, 8.9, [1, 2]]In [44]: del list_a[1:3] # 删除切片In [45]: list_aOut[45]: ['b', [1, 2]]
list(清單)推導式
處理一個序列中的所有或部分元素并傳回結果清單的一種緊湊寫法。見下面的例子:
In [50]: even = [2 * i for i in range(10)]In [51]: evenOut[51]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]In [52]: even2 = [i for i in range(20) if i % 2 == 0]In [53]: even2Out[53]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
生成even的過程是把0~10之間的數字都乘以2變成偶數;
生成even2的過程是從0~20之間挑選出偶數。
這兩個都是清單推導式,并且後面的是加了if條件隻處理原清單的部分元素。
list(清單)相關的内置函數
Python内置函數中有一些可以對list進行操作,它們是:
(1)len()
計算清單的長度,即計算清單元素的個數)
In [55]: len([1,2,3])Out[55]: 3
(2)max()
傳回清單元素中的最大值,清單元素必須是同一類型且可比較,比如都是數字型的,或都是字元串,如果類型不統一就會報錯:
In [57]: max(['a', 'b', 'c'])Out[57]: 'c'In [58]: max([1,2,'a'])---------------------------------------------------------------------------TypeError Traceback (most recent call last) in ----> 1 max([1,2,'a'])TypeError: '>' not supported between instances of 'str' and 'int'
(3)min()
傳回清單元素中的最小值。元素類型要求跟max()一樣。
In [59]: min([1,2,3])Out[59]: 1In [60]: min(['a', 'b', 'c'])Out[60]: 'a'In [61]: min([1,2,'a'])---------------------------------------------------------------------------TypeError Traceback (most recent call last) in ----> 1 min([1,2,'a'])TypeError: '
(4)sum()
計算清單所有元素的和,其元素類型必須是數值型的(整數、浮點數)
In [63]: sum([1,2,3])Out[63]: 6In [64]: sum([1.2, 3.2, 4.3])Out[64]: 8.7In [65]: sum(['a', 'b', 'c'])---------------------------------------------------------------------------TypeError Traceback (most recent call last) in ----> 1 sum(['a', 'b', 'c'])TypeError: unsupported operand type(s) for +: 'int' and 'str'
(5)sorted()
傳回一個排序的清單,但并不改變原清單。
In [66]: sorted([3, 9, 0, 5])Out[66]: [0, 3, 5, 9]In [68]: sorted(['python', 'yuanrenxue', 'good'])Out[68]: ['good', 'python', 'yuanrenxue']
(6)list()
生成一個空清單,或把其它類型資料轉換成list。
In [69]: list()Out[69]: []In [70]: list('python')Out[70]: ['p', 'y', 't', 'h', 'o', 'n']
(7)any()
隻要清單中有一個元素是True就傳回True。
In [72]: any([0, '', '3'])Out[72]: True
(8)all()
隻有清單所有元素為True才傳回True。
In [73]: all([0, '', '3'])Out[73]: FalseIn [74]: all([3, 'a', True])Out[74]: True
list(清單)的内置方法
前面我們說的是Python語言的“内置函數”,這裡我們講的是清單本身的“内置方法”。函數和方法有什麼差別呢?
函數: 是一系列語句的集合,調用後可以傳回一個或一些值。可以給它傳遞0個或多個參數,這些參數可能被用于函數内部的執行過程。方法: 就是定義在類内部的函數。很明顯,方法是與某個對象關聯的。方法的調用方法就是在對象後面加.再加方法名稱。
Python中的一切都是對象,清單也不例外,那自然清單也有其自有的方法,總結為下表:
Python list(清單)總結
清單是Python中最常用的資料結構之一,主要用于資料的順序存儲。
練習
熟悉對清單的各種操作。比較清單和字元串的相似之處。