1. 程式人生 > >Python的序列類型——List

Python的序列類型——List

com 錯誤 報錯 mar div 括號 擴展 隊列 獲取

List

  列表 List,本質是一個鏈表,從鏈表的實現角度來講,鏈表的每一個結點都存放著值和指向下一個節點的指針。

因此鏈表在內存的存儲可以是不連續的,它是一種高效的數據結構。因此列表與字符串的區別是列表可以進行任意

的修改。並且,列表的元素是任意的數據類型。當然,它支持循環、切片等多種操作。如果我們對列表進行切片,

那結果仍是一個列表。

列表在對某個序列進行轉換的時候,內部是通過循環進行的,而數字不能作為循環的對象因此數字不能轉化

為列表;而當列表轉化為字符串的時候,字符串函數將整個列表作為字符串,這種做法讓字符串變得醜陋,如果想

變得美觀可以自己寫循環解決。

1. 將字符 ==為列表

string = "abcdefg"
print(list(string))

2. 列表 ==字符串:使用for循環

li = [1,2,3,4,"I","love","you"]
for i in li:
    string = string + str(i)
print(string)

3. 列表 ==字符串:列表中只有字符串時可使用join函數

li = ["I","love","you"]
print("".join(li))

4. 聊聊extend(iterable)函數,該函數能擴展原列表,參數iterable

是可叠代對象

li = [1,2,3,4,"I","love","you"]
li.extend([6,"here"])
li.extend("abc")    #請註意和append的區別
print(li)           #輸出:[1, 2, 3, 4, ‘I‘, ‘love‘, ‘you‘, 6, ‘here‘, ‘a‘, ‘b‘, ‘c‘]

註:與append相比,extend相當與在內部進行循環,再使用append函數往列表追加元素

5. 把列表當作堆棧使用

  append() 方法可以把一個元素添加到堆棧頂。用不指定索引的 pop() 方法可以把一個元素從堆棧頂釋放出來。

li = ["1","2","3","4","5"]
li.append("6")
print(li)          #輸出:[‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘]
del_li = li.pop()    #不加參數的pop
print(del_li)       #獲取刪除的值:6
print(li)          #顯示刪除結果:[‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘]

6. 把列表當作隊列使用

   我們也可以把列表當做隊列使用,隊列作為特定的數據結構,最先進入的元素最先釋放(先進先出)。不過,

列表這樣用效率不高。相對來說從列表末尾添加和彈出很快;在頭部插入和彈出很慢(因為,為了一個元素,要移

動整個列表中的所有元素)。要實現隊列,使用 collections.deque,它為在首尾兩端快速插入和刪除而設計。例如:

from collections import deque   #導入 collections模塊的deque函數
li = ["Lily","Lynn Lee","John"]
queue = deque(li)       #使用deque函數
queue.append("Alger")   #往隊列插入數據           
queue.popleft()         #刪除頭部
print(queue)           #打印結果:deque([‘Lynn Lee‘, ‘John‘, ‘Alger‘])

7. 列表推導式

   列表推導式由包含一個表達式的括號組成,表達式後面跟隨一個 for 子句,之後可以有零或多個 for 或 if 子句。

結果是一個列表,由表達式依據其後面的 for 和 if 子句上下文計算而來的結果構成。它的表達式的一般形式為:

[ 表達式 for [ if 子 句 ] ] 。 下面將以簡單的例子說明列表推導式的作用。

7.1 生成列表中x的2次冪——

  • 不使用列表推導式
li = list(map(lambda x: x**2, range(10))) 
print(li)  #打印結果為:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  • 使用列表推導式
li = [x**2 for x in range(10)]
print(li)  #打印結果為:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

7.2 按兩個列表元素不同的條件生成坐標——

  • 不使用列表推導式
li = []
for x in [1,2,3]:
    for y in [3,4,5]:
        if x != y:
            li.append((x, y))
print(li)  #輸出:[(1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5)]  
  • 使用列表推導式
li = [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
print(li)  #輸出:[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

  很顯然,列表推導式非常簡潔,增強程序的可讀性

  

  7.3 列表推導式的規範——

     列表推導式的一般形式為:[ 表達式 for [if子句] ],在這裏表達式如果不是簡單的一條語句應該使用括號括起來。

不用括號括起來報錯(語法錯誤)

[x, x**2 for x in range(6)]   #報錯  

     用括號括起來正常執行

from math import pi
li = [str(round(pi, i)) for i in range(1, 4)]
print(li)   #輸出:[‘3.1‘, ‘3.14‘, ‘3.142‘]

  7.4 應用舉例:交換矩陣的行列——

mylist = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
    ]
#第一個推導式獲取原矩陣的三行數據,然後對於每一行一次打印
li = [ [row[i] for row in mylist] for i in range(4) ]
print(li)   #輸出[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

  8. 其他常用函數總結如下:

技術分享圖片

Python的序列類型——List