2020年5月2日 星期六

Python,利用單行For迴圈產生List資料組



利用單行For迴圈產生List資料組


圖1 單行For迴圈的功能示意圖

如果要產生一個1到10的整數數列,並且存入List資料組,依照我們前面學過的語法,可以這樣做:

num_list = []
for i in range(1, 11):   # range()的第三個參數沒有設定,表示用預設值1
    num_list += [i]   # 也可以寫成num_list.extend([i])

但是有一個更簡單的寫法:

num_list = [i for i in range(1, 11)]

我們在方括弧中,用內建函式range()產生一個數列。這個數列的每一個值會先複製給自訂變數i,然後再把自訂變數i的內容存入List資料組。這個語法的完整格式如下(參考圖1):

資料組 = [自訂變數 for 自訂變數 in 資料組 if 關係運算式]

也就是說,可以在For迴圈後面加上If判斷式,只有當If判斷式的結果是True的時候,那一個自訂變數的值才會存入List資料組。舉例來說,如果要把前面的例子改成產生偶數的數列,只要加入If判斷式如下:

num_list = [i for i in range(1, 11) if i % 2 == 0]

這個語法也可以用來從資料組複製資料到另一個資料組,例如:

# scores是儲存考試成績的List資料組
scores_copy = [item for item in scores]         # 複製全部成績
fail = [item for item in scores if item < 60]   # 只複製不及格的成績

這個語法還可以進一步擴充,成為多個自訂變數的情況,如以下範例:

sum = [i + j for i in range(1, 4) for j in range(10, 14)]

這種情況就像多層迴圈。第一個變數i的迴圈在第一層,第二個變數j的迴圈在第二層,依此類推。也就是說,後面的變數改變一輪之後,前面的變數才會進入下一項。所以上述程式的功能就等於以下程式碼:

sum = []
for i in range(1, 4):
    for j in range(10, 14):
        sum += [i + j]

執行以上程式碼之後,sum的內容為:

[11, 12, 13, 14, 12, 13, 14, 15, 13, 14, 15, 16]

我們也可以加入If判斷式,篩選出想要的值,例如:

sum = [i + j for i in range(1, 4) if i % 2 == 1 
        for j in range(10, 14) if j % 2 == 0]

執行之後,sum的內容如下:

[11, 13, 13, 15]

關係運算子也可以用來比較資料組。問題是資料組中有很多筆資料,要如何比較?我們把資料組的比較方式整理說明如下:
  1. 只有相同型態的資料組才可以比較。也就是說,Tuple資料組只能夠和Tuple資料組比較,List資料组只能夠和List資料組比較。
  2. 比較資料組的方式是先比較它們的第一項資料。如果無法分出大小,就繼續比較第二項資料,依此類推。如果比較的過程中,某一個資料組已經沒有資料可以比較,就表示該資料組比較小。如果所有的資料都一樣,就表示二個資料組相等。
  3. 資料組中要比較的資料必須具備相同的型態,例如第一個資料組的第一項資料是數值,那麼另一個資料組的第一項資料也必須是數值。
舉例來說,如果我們建立以下四個資料組:

x1 = 1, 'a', (1, 1)      # tuple資料組
x2 = 2, 'b', (2, 2)      # tuple資料組
y1 = [1, 'a', (1, 1)]    # list資料組
y2 = [2, 'b', 2]          # list資料組

其中x1和x2是Tuple資料組,y1和y2是List資料組。x1和x2的相同位置的資料型態都一樣,所以x1可以和x2比較。但是y1和y2的相同位置的資料型態卻不一樣(也就是第三筆資料的型態不一樣,一個是Tuple資料組,另一個是數值),所以y1和y2不能夠比較。

-------------------------------------

沒有留言:

張貼留言