從零開始的Python計劃#a5.1 【列表操作,多維列表】


我!終於!來!更新了!!!這幾天一直跟朋友琢磨稿子,導致推遲了幾天,再不更新拖延症要犯了hhh!
之前4.1和4.2有講過列表,使用while循環,for循環,range範圍等,這篇會更加仔細得再進行延伸,所以對列表不熟悉的可以先去看第四章哈

1·len函數

使用len()遍歷列表
我們可以使用len()函數遍歷整個列表,將len的結果提供給range函數
例:

colours=['White', 'Red', 'Blue']
for i in range(len(colours)):
    print(colours[i])

range(len(colours))=range(3),range(3)的範圍是0-2,然後最後一句的打印不是一次性的print,在每次i變化的時候,它都會進行print,所以會導致換行的結果。
這裏是引用

2·extend方法

extend將列表作爲參數並附加所有元素(列表合併列表)

錯誤示例1:
t1 = ['a', 'b', 'c']
t2 = ['d', 'e']
print(t1.extend(t2))

錯誤示例2:
t1 = ['a', 'b', 'c']
t1 = t1.sort()
print(t1)

“.”指調用一個方法

大家可能都會覺得這兩個print都會返回[‘a’, ‘b’, ‘c’, ‘d’, ‘e’],
事實上並不是這樣:
在這裏插入圖片描述
我們可能會疑惑使用extend不是會得到合併兩個列表元素的列表嘛?這是因爲:
大多數列表方法都是無效的!它們修改列表並返回None(什麼也不返回)
示例1中,extend修改t1,但什麼也不返回。sort也是如此。
示例2中,用sort方法去給t1的元素排序,並在t1存儲調序結果。因爲我們把None存儲進t1,如果我們要整理t1的元素,直接調用sort方法,函數t1.sort,不用把它存儲在變量裏,代碼中sort已經調整了t1,根據函數功能已經修改了t1,所以t1 = t1.sort() 要改成t1.sort

所以經過修改,代碼應該改成這樣,方法纔會發揮作用:

示例1
t1 = ['a', 'b', 'c']
t2 = ['d', 'e']
t1.extend(t2)
print(t1)

示例2
t1 = ['c', 'b', 'a']
t1.sort()
print(t1)

打印結果:
['a', 'b', 'c', 'd', 'e']
['a', 'b', 'c']

3·減少Reduce,映射Map,過濾Filter

reduce,map,filter是在討論列表時的通用概念,它們不是指特定的功能和方法,而是指可以對列表執行的可能事情的通用概念

Reduce

當我們將一系列元素組合成單個值時,可以想到這個概念。

myFullList = [1, 2, 3]
reducedList = sum(myFullList)
print(reducedList)

打印結果:
6

取用列表,通過函數功能,讓它減少成爲一個值,將許多維度變成一個,稱爲減少reduce

Map

當我們將函數"映射mapping"到序列的所有元素時,我們可以用"map"定義

"""
def capitalise_all_letters(mySequence): 
    newSequence = []
    for s in mySequence:
        newSequence.append(s.capitalize()) 
    return newSequence
lowCaps = ['h', 'e', 'l', 'l', 'o']
print(capitalise_all_letters(lowCaps))

打印結果:
['H', 'E', 'L', 'L', 'O']

capitalize表示使用大寫的方法
把舊的序列中元素變成大寫並返回到新的列表中
代碼所示例的方法就是mapping,採用大寫的方法,把它應用在列表的每個元素上。列表的每個元素被函數修改和存儲到另一個地方,所以map就是將新函數映射到序列的每個元素。

Filter過濾

filter可以看作我們只選用一些元素,篩選其它的元素
在這個例子中,只取大寫字母

def only_upper(mySequence):
    newSequence = []
    for s in mySequence:
        if s.isupper():
            newSequence.append(s)
    return newSequence

mySentence = 'This is a string, but also a sequence!' 
print(only_upper(mySentence))

打印結果:
['T']

isupper是檢查大小寫的函數
因爲裏面唯一的大寫字母是T,所以在only_upper函數中的運算結果,返回的新列表中只有大寫T。我們把類似於這樣的操作稱之爲過濾。只篩選出大寫字母,過濾掉不是大寫字母的其它元素。

4·嵌套列表

當我們在另一個列表中有一個列表時,就會產生嵌套列表

例:在這裏插入圖片描述

嵌套列表中,列表可以包含其他列表作爲其中的元素

5·多維列表

一維列表在這裏插入圖片描述
二維列表的概念可視化
在這裏插入圖片描述
有橫向和縱向

看一下對比,多維列表就是列表不是隻走一個方向,可能有第二個方向
Python沒有任何默認的數據結構來存儲多維序列,但是可以通過列表內部的list來實現。
Python對於多維列表沒有特殊的名稱,比如元組,列表這些命名所以我們要用嵌入列表(把列表放進另一個列表)來表現多維列表,創造某種網格

在這裏插入圖片描述

list_2d = [[5,2,3], [8,7,1], [4,6,9]] 

print(list_2d)
打印結果:
[[5, 2, 3], [8, 7, 1], [4, 6, 9]]


如果我想要大列表的第3個列表的第2個數字6(在嵌入列表中索引號爲1print(list_2d[2])
打印結果:
[4, 6, 9]
print(list_2d[2][1])
打印結果:
6
可以先用list_2d[2]來選出第三個列表,再用list_2d[2][1]選擇第三個列表中的第二個數字6

舉一反三:
print(list_2d[0][2])
打印結果:
3

print(list_2d[1][0])
打印結果:
8

再看一個多維列表示例:

def list_2d():
    list2d = []
    #給空列表增加三個空列表:
    list2d.append([]) 
    list2d.append([])
    list2d.append([])
    #我們已經準備好可以包含三個列表的三個插槽,再建立一個二維網格:
    #初始化2d表格,通過for循環來初始化列表
    for row in range(3):
        for col in range(3):
            list2d[row].append(row + col)
    #設定了row的範圍,list2d[row]中包含0,1,2,接着橫向加上col的列表元素0,1,2
    for row in range(3):
        print(list2d[row])
    #函數裏定義的數不能在函數外使用,所以要定義row
list_2d()

[0+0 , 0+1 , 0+2]得出第一個列表[0 , 1 , 2]
再到[1+0 , 1+1 , 1+2]得出列表[1,2,3]
然後再重複,得出列表[2,3,4]
每個單個的row運行一次col,最後打印row的每個元素。因爲它是一個二維列表,row的每個元素本身就是一個列表,因此,會打印三個單獨的列表。

多維列表會有一點點複雜的感覺,所以大家一定要耐心!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章