[6] 進階資料型別 part1 - 字串、List 操作


Posted by bessyhuang on 2023-05-27

Python 內建資料型別

  • Variables can store data of different types, and different types can do different things.
    • Text Type: str
    • Numeric Types: int, float, complex
    • Boolean Type: bool
    • Sequence Types: list(串列), tuple(序對), range
    • Mapping Type: dict(字典)
    • Set Types: set(集合), frozenset
    • Binary Types: bytes, bytearray, memoryview
    • None Type: NoneType

進階:字串處理

常用的內建函式

💡 Python 中,關於字串處理的內建函式,其實還有很多,碰到再 google 就可以了。

  • 計算字串長度 (幾個字元): len()
      word = "Abyss"
      print(len(word))
    
  • 以「字元」分割字串,最終回傳切割後的串列 (list): split()

      sent = '春眠不覺曉,處處聞啼鳥,夜來風雨聲,花落知多少。'
      print(sent.split(','))
    
      # ['春眠不覺曉', '處處聞啼鳥', '夜來風雨聲', '花落知多少。']
    

索引 (Index)

text = '一二三四五六七八九零'

print(text[0])
# 一
print(text[1])
# 二
print(text[-1])
# 零
print(text[-2])
# 九

print(text[0:10:1])
print(text[:])
# 一二三四五六七八九零
  • 利用 中括號 [] 取出/操作 字串的部份內容 (即 字元)。
  • 字串的索引值 (index) 是 從 0 開始 的。

取出部分字串 (Slicing)

text = '一二三四五六七八九零'

print(text[1:9:2])
# 二四六八
print(text[1:9:-1])
# 
print(text[::-1])
# 零九八七六五四三二一
print(text[6:-1])
# 七八九
print(text[8:])
# 九零
print(text[:3])
# 一二三


# 解析
 一  二  三  四 五  六 七 八  九 零
 0   1  2   3  4  5  6  7  8  9  [index]
-10 -9 -8  -7 -6 -5 -4 -3 -2 -1  [index]
  • word[start : end : sep]
    • 預設
      • word[0: len(word): 1] = word[:] = word
    • 輸出範圍
      • 從起始到結束的前一個字元,每隔 sep 個字元取一個字元出來,即輸出 word[start], word[start + 1], ... word[end - 1]
      • 簡言之,包含 start,不包含 end,間隔 sep 個字元取出
    • sep 預設為 1。若 sep 大於 0,表示由左到右取出字元;若 sep 小於 0,表示由右到左取出字元。

List 串列

為何需要 List?


簡介

  • 由一連串資料所組成、有順序且可改變內容(mutable)的序列。
  • [ ] 中括號 標示,裡面的資料以逗號 , 隔開。
  • list 中可以包含不同型別的元素。
      test1 = [1, "Taipei", 2, "Tokyo"]
    
  • 若 list 的元素相同但順序不同,表示不同 list。

      test1 = [1, "Taipei", 2, "Tokyo"]
      test2 = [2, 1, "Taipei", "Tokyo"]
    
      print(test1 == test2)
      # False
    

建立串列

  • 空串列

      # 方法一:使用 Python 內建的 list() 函式建立串列
      list1 = list()
    
      # 方法二
      list1 = []
    
  • 包含數值或文字的串列

      list2 = [1, 2, 3]
      list3 = "A,B,C,D".split(',')
    
      print(list3, type(list3))
      # ['A', 'B', 'C', 'D'] <class 'list'>
    
  • 從 range 建立串列

      # 方法一
      list4 = list(range(5))
    
      # 方法二:串列解析法 (List comprehension)
      list4 = [i for i in range(5)]
    
      # 方法三
      list5 = []
      for i in range(5):
          list5.append(i)
      print(list5)
      # [0, 1, 2, 3, 4]
    
  • 串列解析法 (List comprehension)

    • Python 提供一種更簡潔的方式來建立串列。

        # 語法
        [expression for item in list]
        [expression for item in list if condition]
      
        expression:欲輸出的 串列元素運算結果
      
        L1 = [i for i in range(5)]
        # [0, 1, 2, 3, 4]
      
        L2 = [i*2 for i in range(5)]
        # [0, 2, 4, 6, 8]
      
        a1 = [-1.5, -2, 0, 2, 8]
        a2 = [abs(i) for i in a1]
        # [1.5, 2, 0, 2, 8]
      
        a3 = [i for i in a1 if i >= 0]
        # [0, 2, 8]
      

內建函式

  • len(L):傳回 L (串列參數) 的長度,亦即包含幾個元素。
  • max(L)min(L):傳回 L 中最大、最小的元素。
  • sum(L):傳回 L 中元素的總和。
  • random 模組的 shuffle(L):將 L 中的元素隨機重排。

      import random
    
      L = [1,2,3,4,5]
      random.shuffle(L)
      print(L)
    

運算子

  • +*

      print([1, 'abc', '我'] + ['Taipei', 2])            
      # [1, 'abc', '我', 'Taipei', 2]
    
      print([1, 'a'] * 3)                
      # [1, 'a', 1, 'a', 1, 'a']
    
  • 比較運算子: > < >= <= == !=
    • 進行比較時,會先從兩個串列的第一個元素開始。
      • 若不相等,顯示比較結果。
      • 相等繼續比較第二個元素,依此類推。
          print([1, 2, 3] < [1, 3, 2])
          # True
        
  • in not in 運算子
      print("ab" in [2, "abc", "ba"])
      # False
    
  • Index 與 Slicing
      💡 預設:   L[ 0 : len(L) : 1] == L[ : ] == L
      => L[start : end : step]
    

串列處理方法

💡 符號表示之說明
   - x  單一的元素
   - L  串列 (list)
   - i  索引值
  • list.append(x)list.extend(L)list.insert(i, x)list.remove(x)list.pop([i])
      L = [10, 20, 30]
      L1 = ['a', 5]
      L.append(1)
      print(L)
    
  • list.index(x)list.count(x)list.sort(reverse=False)list.reverse()list.copy()list.clear()
      L = [10, 20, 30, 1, 2, 10]
      print(L.index(10))         # 傳回元素 10 第一次出現的索引
      print(L.count(10))
    
  • del

    • 用來從 list 中 刪除 指定索引 的元素。

        L = [-1, 1.5, 0, 1, 2, 3, 4, 5]
        del L[2]
        print(L)
        # [-1, 1.5, 1, 2, 3, 4, 5]    # 刪除索引為 2 的元素
      
        del L[2:4]
        print(L)
        # [-1, 1.5, 3, 4, 5]          # 刪除索引為 2~3 的元素
      
        del L[:]
        print(L)
        # []                          # 刪除所有元素(得到空串列)
      
    • 刪除 變數本身
        L = [-1, 1.5, 0, 1, 2, 3, 4, 5]
        del L
        print(L)
        # NameError: name 'L' is not defined     # 存取被刪除的變數 L 將會發生錯誤!
      

多維串列(nD list)

1D list

# 1D list
a = [1, 2, 3, 4, 5, 6]

2D list

a = [[1, 2, 3], [4, 5, 6]]

print(a[0][1])
#2

print(a[1][2])
#6

3D list

a = [[1, [2, 3]], [4, [5, 6]]]

print(a[0][1][0])
#2

print(a[1][1][1])
#6

練習題

CodeWars


#Python #字串 #Index #Slicing #list







Related Posts

Day 62 - Coffee & Wifi Project

Day 62 - Coffee & Wifi Project

ES6 新功能

ES6 新功能

MTR04_1019

MTR04_1019


Comments