iT邦幫忙

2021 iThome 鐵人賽

DAY 14
1
Software Development

宇宙 69 大魔王的 python 世界系列 第 14

【Day 14】List Comprehension 列表生成式

前言

List Comprehension 列表生成式為 Python 內建的,相當強大且簡單就能生成 list 的方法,今天會先介紹一下 loop,再來介紹生成式的各種使用方法。

List

loop

可以使用 for loop 來把 list 的每一個元素都跑一遍。

list1 = ['酷哥', '辣妹', '小哥', '小姐']
for x in list1:
    print(x)

也可以用 len() 先取出 list 的長度,再用 index 來做

list1 = ['酷哥', '辣妹', '小哥', '小姐']
for x in range(len(list1)):
    print(list1[x])

或是使用 while loop 來做,一樣用 len 取出這個 list 的長度,再根據 index 取值

list1 = ['酷哥', '辣妹', '小哥', '小姐']
i = 0
while i < len(list1):
    print(list1[i])
    i += 1

生成式

  • 如果我想要生成 [1, 2, 3, 4, 5] 的一個 list,可以使用以下四種方法。

    • 使用 list.append() 函式,來一個一個輸入

      a = []
      a.append(1)
      a.append(2)
      a.append(3)
      a.append(4)
      a.append(5)
      print('a =', a)
      
    • 使用 range 來生成 1 - 5,並用 append 按照迴圈加入 list 當中

      b = []
      for i in range(1, 6):
          b.append(i)
      print('b =', b)
      
    • 使用 range 來生成 1 - 5,並直接用 list() 轉為 list

      c = list(range(1, 6))
      print('c =', c)
      
    • 簡化過後可以變為這樣

      d = [x for x in range(1, 6)]
      print('d =', d)
      

  • 如果要生成 [1^2, 2^2, 3^2, ..., 10^2] 1 到 10 的平方

    a = []
    for x in range(1, 11):
        a.append(x ** 2)
    print('a =', a)
    

    可以把上面的 code 簡化成底下的樣子

    b = [x ** 2 for x in range(1, 11)]
    print('b =', b)
    

    撰寫升成式時,需要記得要把「要生成的元素」放在前面,後面放 for loop

  • 在生成式裡面加入判斷條件:只要偶數的平方的話,加一個 if x % 2 == 0 就搞定了

    b = [x ** 2 for x in range(1, 11) if x % 2 == 0]
    print('b =', b)
    

  • 雙層生成式

    for 前面當作 str 進行撰寫,並用雙層生成式來排列出所有可能性

    c = [a + b for a in '123' for b in '456']
    print(c)
    

  • 昨天的文章中有提到用 for loop 可以一次把 dict 中的整個 item 取出,並放在兩個變數之中,這裡也可以用在列表生成式。

    # 昨天的 code
    dict2 = {'a':'A', 'b':'B', 'c':'C'}
    for x, y in dict2.items():
        print(x, y)
    
    dict2 = {'a':'A', 'b':'B', 'c':'C'}
    list2 = [x + '=' + y for x, y in dict2.items()]
    print(list2)
    

  • 加上 String Methods 一起使用

    list1 = ['apple', 'banana', 'orange']
    list2 = [x.capitalize() for x in list1]    # 把字串字首變為大寫的函式
    print(list2)
    

list.sort:排序 list 內的元素

  • list.sort()

    預設的 .sort() 是升冪排序的,數字會由小到大,英文字母由 a 到 z

    list1 = ['z', 'b', 'zb', 'za', 'osww', 'gegw']
    list1.sort()
    print(list1)
    list2 = [23, 45, 69, 64, 33, 335, 3]
    list2.sort()
    print(list2)
    

  • reverse = True

    如果想要降冪排序,則加上 reversr = True 在括號內即可

    list1 = ['z', 'b', 'Zb', 'za', 'osww', 'gegw']
    list1.sort(reverse = True)
    print(list1)
    list2 = [23, 45, 69, 64, 33, 335, 3]
    list2.sort(reverse = True)
    print(list2)
    

  • key:可以自訂你的排列方式

    底下的程式為:根據他們的平方大小來排序

    def myfunc(x):
        return x ** 2
    list2 = [-1, -6, 69, 64, -33, 335, 23]
    list2.sort(key = myfunc)
    print(list2)
    

    若在加上 reverse = True 就可以把輸出改為降冪

    def myfunc(x):
        return x ** 2
    list2 = [-1, -6, 69, 64, -33, 335, 23]
    list2.sort(key = myfunc, reverse = True)
    print(list2)
    

待續...


上一篇
【Day 13】Dictionary 介紹
下一篇
【Day 15】Function 函式
系列文
宇宙 69 大魔王的 python 世界30

尚未有邦友留言

立即登入留言