Python list(列表)

veelion發表於2018-12-23

Python的基本資料型別有整數,浮點數,布林,字串,它們是最基本的資料。在實際程式設計中,我們要經常組織由很多基本資料組成的集合,這些集合的不同組織方式就是:資料結構,今天講的是資料結構中的Python list(列表)。資料結構就是一些資料組合得到的“複合”資料型別。

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_a
Out[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] = 2

In [33]: list_b
Out[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的一種“內建型別”,它也像基本型別數字、字串那樣可以進行一些運算子的運算,如下表所示:

運算子 含義 表示式 結果
+ 列表合併在一起 ['a', 'b', 'c'] + [1, 2, 3] ['a', 'b', 'c', 1, 2, 3]
* 列表重複 ['a'] * 3 ['a', 'a', 'a']
in 是否為列表元素 'a' in ['a', 'b'] True

從頭到尾遍歷(迭代)一個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_a

In [37]: list_a
---------------------------------------------------------------------------
NameError    Traceback (most recent call last)
<ipython-input-37-1dc2d082cc20> in <module>
----> 1 list_a

NameError: 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_a
Out[43]: ['b', 3, 8.9, [1, 2]]

In [44]: del list_a[1:3] # 刪除切片

In [45]: list_a
Out[45]: ['b', [1, 2]]

Python資料結構: list(列表)

list(列表)推導式

處理一個序列中的所有或部分元素並返回結果列表的一種緊湊寫法。見下面的例子:

In [50]: even = [2 * i for i in range(10)]

In [51]: even
Out[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]: even2
Out[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)
<ipython-input-58-d6e404f692f3> in <module>
----> 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]: 1

In [60]: min(['a', 'b', 'c'])
Out[60]: 'a'

In [61]: min([1,2,'a'])
---------------------------------------------------------------------------
TypeError    Traceback (most recent call last)
<ipython-input-61-c2d30ec5fffc> in <module>
----> 1 min([1,2,'a'])

TypeError: '<' not supported between instances of 'str' and 'int'

(4)sum()
計算列表所有元素的和,其元素型別必須是數值型的(整數、浮點數)

In [63]: sum([1,2,3])
Out[63]: 6

In [64]: sum([1.2, 3.2, 4.3])
Out[64]: 8.7

In [65]: sum(['a', 'b', 'c'])
---------------------------------------------------------------------------
TypeError   Traceback (most recent call last)
<ipython-input-65-f2e6eb2051e3> in <module>
----> 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]: False

In [74]: all([3, 'a', True])
Out[74]: True

list(列表)的內建方法

前面我們說的是Python語言的“內建函式”,這裡我們講的是列表本身的“內建方法”。函式和方法有什麼區別呢?

  • 函式: 是一系列語句的集合,呼叫後可以返回一個或一些值。可以給它傳遞0個或多個引數,這些引數可能被用於函式內部的執行過程。
  • 方法: 就是定義在類內部的函式。很明顯,方法是與某個物件關聯的。方法的呼叫方法就是在物件後面加.再加方法名稱。

Python中的一切都是物件,列表也不例外,那自然列表也有其自有的方法,總結為下表:

方法 功能 示例 結果
append() 把一個元素加到列表的尾部 a=[1,2];a.append('a') a變為 [1,2,'a']
insert() 把一個元素加到列表的特定位置 a=[1,2]; a.insert(1, 'c') a變為:[1, 'c', 2]
remove() 刪除第一個出現的某元素 a=[1,2]; a.remove(2) a變為:[1]
pop() 刪除並返回某個位置(索引)的元素 a=[1,2];a.pop(1) a變為:[1]
clear() 清空列表 a=[1,2];a.clear() a變為:[]
index() 返回遇到的第一個某值的索引,
如果列表不包含該值則丟擲錯誤
a=[1,1,1];a.index(1) 返回0
count() 返回列表中某值的個數 a=[1,1,2];a.count(1) 返回2
sort() 對列表進行排序 a=[3,2,1];a.sort() a變為:[1,2,3]
reverse() 將列表倒置 a=[2,1,3];a.reverse() a變為:[3,1,2]

Python list(列表)總結

列表是Python中最常用的資料結構之一,主要用於資料的順序儲存。

練習

  1. 熟悉對列表的各種操作。
  2. 比較列表和字串的相似之處。

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章