1. 程式人生 > >Python中列表、元組、字典、集合與字串,相關函式,持續更新中……

Python中列表、元組、字典、集合與字串,相關函式,持續更新中……

> 本篇部落格為博主第一次學 Python 所做的筆記(希望讀者能夠少點浮躁,認真閱讀,平心靜氣學習!) **補充:** - 列表、元組和字串共同屬性: - 屬於有序序列,其中的元素有嚴格的先後順序 - 都支援雙向索引,索引範圍 [ -L, L-1 ] ,L -- 表示列表、元組和字串的長度(分正向索引和反向索引)。 - **正向索引**:0 表示第 1 個元素,1 表示第 2 個元素,2 表示第 3 個元素... - **反向索引**:-1 表示最後 1 個元素,-2 表示倒數第 2 個元素,-3 表示倒數第 3 個元素... # 一、列表(關於列表的所有內容): > 放在一對方括號中,相鄰元素之間使用逗號分隔。 - 同一個列表元素的資料型別可以各不相同。 - 列表包含: 1. **整數**、**浮點數**、**複數**、**字串** 等 基本型別元素。 2. **列表**、**元組**、**字典**、**集合**、**函式** 或 **其他任意物件**。 ## 建立列表: - 使用方括號直接建立 - list() 函式把元組、range 物件、字串、字典、集合,以及 map 物件、zip 物件、enumerate 物件或其他類似物件 **轉換** 為列表。 - 內建函式( sorted() )、標準庫函式( random.sample() )或擴充套件函式( jieba.lcut() )也會返回列表 ## 函式: #### 1. 訪問元素: - 使用者可以使用整數作為下標來隨機訪問其中任意位置上的元素 ```python data = list(range()) # data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(data[1]) # 結果 1 print(data[-1]) # 結果 9 …… ``` - 如果指定的下標不在有效範圍內,程式碼會丟擲異常提示下表越界 #### 2. 其他常用方法: > **lst** - 表示列表物件 |函式 | 解釋| |:--------:| :-----| | `lst.append(x)` | 將 x 追加至列表 lst 的尾部,不影響列表中已有元素的位置,也不影響列表在記憶體中的起始地址 | | `lst.insert(index, x)` | 在列表 lst 的 index 位置處插入 x,該位置之後的所有元素自動向後移動,索引加 1 | | `extend(L)` | 將列表 L 中所有元素追加至列表 lst 的尾部,不影響 lst 列表中已有元素的位置,也不影響 lst 列表在記憶體中的起始地址。 | | `pop([index])` | 刪除並返回列表 lst 中下標為 index 的元素,該位置後面的所有元素自動向前移動,索引減 1。index 預設為 -1,表示刪除並返回列表中最後一個元素 | | `remove(x)` | 在列表 lst 中刪除第一個值為 x 的元素,被刪除元素位置之後的所有元素自動向前移動,索引減 1;如果列表中不存在 x 則丟擲異常。 | | `count(x)` | 返回 x 在列表 lst 中的出現次數 | | `index(x)` | 返回列表 lst 中第一個值為 x 的元素的索引,若不存在值為 x 的元素則丟擲異常。 | | `sort( key = None , reverse = False)` | 對列表 lst 的所有元素進行原地逆序,首尾交換 | #### 3. 推導式: > 使用 **非常簡潔** 的方式對列表或其他可迭代物件的元素進行遍歷、過濾或再次計算,快速生成滿足特定需求的新列表。 ```python # 格式: [expression for expr1 in sequence1 if condition for expr2 in sequence2 if condition2 for expr3 in sequence3 if condition3 ... for exprN in sequenceN if conditionN ] # 例子: data = [num for num in range(20) if num%2==1] # 等價於 => data = [] for num in range(20): if num%2 == 1: data.append(num) ``` # 二、元組(關於元組的所有內容): ## 建立元組: - 用圓括號放若干元素建立元組(如果只有一個元素,則需要多加一個逗號 `(3,)`) - 用 `tuple()` 函式把 **列表**、**字典**、**集合**、**字串** 以及 **range 物件**、**map 物件**、**zip 物件** 或 **其他類似物件**轉換為元組 ## 元組的好處(與列表對比): | | 元組 | 列表 | |:--:|:--:|:--:| | **修改元素值** | 不能直接修改 | 可以修改 | | **訪問速度** | 快 | 慢 | | **開銷** | 小 | 大 | | **安全性** | 安全 | 不安全 | | **是否可以用作字典的鍵** | 可以 | 不可以 | | **是否可以作為集合的元素** | 可以 | 不可以 | # 三、字典(關於字典的所有內容): > - 屬於容器物件,其中包含若干元素,每個元素包含 “鍵” 和 “值” 兩部分,之間使用冒號分隔,表示一種對應關係。 > - 不同元素之間使用逗號分隔,所有元素放在一對大括號中。 > - “鍵”,可以是 Python 中任意不可變資料,例如整數、複數、字串、元組等型別;不能是列表、集合、字典或其他可變型別,包含列表等可變資料的元組也不能作為字典的 “鍵” ## 函式: #### 1. 訪問: ```python # 初始化 data = dict(name = "張三", age = 8, sex = 'M') ``` - 把 “鍵” 最為下標可以返回對應的 “值”(不存在的話會丟擲異常) ```python print(data('name')) # 結果:張三 ``` - `get()` 方法獲取指定的 “鍵” 對應的 “值”(不存在返回空值或指定的值) ```python print(data.get('age')) # 結果:18 ``` - 支援元素迭代 - 可以將其轉換為列表或元組 ```python print(list(data)) # 結果:['name', 'age', 'sex'] ``` - 可以使用 for 迴圈遍歷其中的元素,預設情況下是遍歷字典中的 “鍵” ```python for key, value in data.items(): print(key, value, sep='\t') # 結果:name 張三 # 結果:age 18 # 結果:sex M ``` - 遍歷字典元素,必須使用字典物件的 `items()` 方法明確說明 ```python print(list(data.items())) # 結果:[('name', '張三'), ('age', '18'), ('sex', 'M')] ``` - 遍歷字典的 “值”,則必須使用字典物件的 `values()` 方法明確說明 ```python print(list(data.values())) # 結果:['張三', '18', 'M'] ``` #### 2. 修改: 當以指定 “鍵” 為下標為字典元素賦值時: - 若該 “鍵” 存在,表示修改該 “鍵” 對應的值: ```python soct = {'IP': '127.0.0.1', 'port': 80} soct['port'] = 8080 print(soct) # 結果:{'IP': '127.0.0.1', 'port': 8080} ``` - 若 “鍵” 不存在,表示新增一個新元素: ```python soct = {'IP': '127.0.0.1', 'port': 80} soct['protocol'] = 'TCP' print(soct) # 結果:{'IP': '127.0.0.1', 'port': 80, 'protocol': 'TCP'} ``` #### 3. 新增: `update()` 方法可以將另一個字典的元素一次性全部新增到當前字典中,如果兩個字典中存在相同的 “鍵”,則以另一個字典中的 “值” 為準對當前字典進行更新: ```python sock = {'IP': '127.0.0.1', 'port': 80} sock.update({'IP': '192.168.9.62', 'protocol': 'TCP'}) print(sock) # {'IP': '192.168.9.62', 'protocol': 'TCP', 'port': 80} ``` #### 4. 刪除: ```python sock = {'IP': '192.168.9.62', 'port': 80, 'protocol': 'TCP'} ``` - `pop()` 方法可以刪除指定 “鍵” 對應的元素,同時返回對應的 “值”。 ```python print(sock.pop('IP')) # 結果:192.168.9.62 ``` - `popitem()` 方法用於刪除並返回一個包含兩個元素的元組,其中的兩個元素分別是字典元素的 “鍵” 和 “值”。 ```python print(sock.popitem()) # 結果:('protocol', 'TCP') ``` - `del` 刪除指定的 “鍵” 對應的元素。 ```python del sock['port'] print(sock) # 結果:{'IP': '192.168.9.62', 'protocol': 'TCP'} ``` # 四、集合(關於集合的所有內容): > 無序、可變的容器物件,所有元素放在一對大括號中,元素之間使用逗號分隔,同一個集合內的每個元素都是唯一的,不允許重複。 #### 0. 建立: - 所有元素放在一對大括號中,建立集合 ```python data = {30, 40, 50} ``` - 使用 `set()` 函式將列表、元組、字串、range 物件等其他可迭代物件轉換為集合。 - 使用集合推導式生成特定的集合,如果原來的資料中存在重複元素,在轉換為集合的時候重複的元素只保留一個,自動除去重複元素。 - 如果原序列或迭代物件中有可變型別的資料,則無法轉換成為集合,丟擲異常。 **特點**: - 集合內資料要求: - 集合中只能包含數字、字串、元組等不可變型別的資料 - 不包含列表、字典、集合等可變型別的資料,包含列表等可變型別資料的元組也不能作為集合的元素。 - 元素是無序的,元素儲存順序和新增順序並不一致。 #### 1. 訪問: - 集合不支援使用下標直接訪問特定位置上的元素,也不支援使用 `random` 中的 `choice()` 函式從集合中隨機選取元素 - 支援使用 `random` 模組中的 `sample()` 函式隨機選取部分元素。 #### 2. 修改: | 函式 | 解釋 | |:--:|:--| | `add()` | 新增新元素,如果存在則忽略該操作,不會丟擲異常。 | | `update()` | 方法使用者合併另一個集合中的元素到另一個集合中,並自動除去重複元素。 | ```python data = {30, 40, 50} data.add(20) print(data) # 結果:{40, 50, 20, 30} data = {30, 40, 50} data.update({40, 60}) print(data) # 結果:{50, 40, 60, 30} ``` #### 3. 刪除: | 函式 | 解釋 | |:--:|:--| | `pop()` | 用來隨機刪除並返回集合中的一個元素,如果集合為空則丟擲異常。 | | `remove()` | 用於刪除集合中的指定元素,如果指定元素不存在則丟擲異常。 | | `remove()` | 用於從集合中刪除一個指定元素,若指定的元素不在集合中則直接忽略該操作。 | ```python data = {30, 40, 50} data.remove(30) print(data) # 結果:{40, 50} data = {30, 40, 50} data.discard(30) print(data) # 結果:{40, 50} data = {30, 40, 50} data.pop() print(data) # 結果:{50, 30} ``` # 五、字串(關於字串的所有內容): > 字串屬於不可變物件。 #### 1. 編碼與解碼 | 函式 | 解釋 | |:--:|:--| | `encode()` | 使用指定的編碼格式把字串編碼為字串,預設使用 UTF-8 編碼格式。 | | `decode()` | 使用指定的編碼格式把位元組串解碼為字串,預設使用 UTF-8 編碼格式。 | #### 2. 將資料格式轉化為特定格式的字串 | 函式 | 解釋 | |:--:|:--| | `format()` | 用於把資料格式轉化為特定格式的字串,該方法通過格式字串進行呼叫。 | **常用的格式**: - b(二進位制格式) - c(把整數轉換成 Unicode 字元) - d(十進位制格式) - o(八進位制格式) - x(小寫十六進位制格式) - X(大寫十六進位制格式) - e/E(科學計數法格式) - f/F(固定長度的浮點數格式) - %(使用固定長度浮點數顯示百分數) ```python # 保留4位小數 # 0 表示引數下標,對應第一個引數 print('{0:.4f}'.format(10/3)) # 結果:3.3333 print('{0:.2%}'.format(1/3)) # 結果:33.33% # 格式化為百分數字符串,總寬度為10,保留2位小數,> 表示右對齊 print('{0:>10.2%}'.format(1/3)) # 結果: 33.33% # 逗號表示在數字字串中插入逗號作為千分符,#x表示格式化為十六進位制數 print("{0:,} in hex is: {0:#x}, in oct is {0:#o}".format(5555555)) # 結果:5,555,555 in hex is: 0x54c563, in oct is 0O25142543 # 可以先格式化下標為 1 的引數,再格式化下標為 0 的引數 print("{1} in hex is: {1: #x}, {0} in oct is {0:o}".format(6666, 66666)) # 結果:66666 in hex is: 0x1046a, 6666 in oct is 15012 # _表示在數字中插入下劃線來為千分符 print('{0:_}, {0:#_x}'.format(10000000)) # 結果:10_000_000, 0x98_9680 ``` #### 3. 單個字串在字串中的相關函式 | 函式 | 解釋 | |:--:|:--| | `index()` | 返回一個字串在當前字串中 **首次出現** 的位置,如果當前字串中不存在此字串,則丟擲異常。 | | `rindex()` | 返回一個字串在當前字串中 **最後一次** 出現的位置,如果當前字串中不存在此字串,則丟擲異常。 | | `count()` | 方法用來返回一個字串在當前字串中 **出現的次數**,如果當前字串中不存在此字串,則返回 0。 | #### 4. 字串的編輯修改 | 函式 | 解釋 | |:--:|:--| | `replace()` | 用來替換字串中指定字元或子字串的所有重複出現,每次只能替換一個字元或一個字串,把指定的字串引數作為一個整體對待,類似與 Word、WPS、記事本、寫字板等文字編輯器的'全部替換'功能。該方法返回一個新字串,並不修改原字串。 | | `maketrans()` | 用來生成字串對映表。 | | `format()` | 用於把資料格式轉化為特定格式的字串,該方法通過格式字串進行呼叫。 | | `translate()` | 用來根據對映表中定義的對應關係轉換字串並替換其中的字元。 | ```python text = "python 是一門非常棒的程式語言。" print(text.replace('棒', '優雅').replace('程式設計', '程式設計')) # 結果:python 是一門非常優雅的程式設計語言。 table = ''.maketrans('0123456789', '零壹貳叄肆伍陸柒捌玖') print('Tel:30647359'.translate(table)) # 結果:Tel:叄零陸肆柒叄伍玖 ``` #### 5. 字串進行排版 | 函式 | 解釋 | |:--:|:--:| | `ljust()` | 居左 | | `rjust()` | 居右 | | `center()` | 居中 | ```python print('居左'.ljust(20)+'結束') # 結果:居左 結束 print('居右'.rjust(20, '#')) # 結果:####################居右 print('居中'.center(20, '=')) # 結果:==========居中========== ``` #### 6. 自定義分隔符對字串分隔 > 不指定預設為空格、換行符和製表符等空白字元)作為分隔符對原字串進行分隔 | 函式 | 解釋 | |:--:|:--:| | `split()` | 從左向右 | | `rsplit()` | 從右向左 | | `join()` | 使用指定的字串作為連線符對可迭代物件中的若干字串進行連線。 | ```python text = 'Beautiful is better than ugly.' print(text.split()) # 結果:['Beautiful', 'is', 'better', 'than', 'ugly.'] print(text.split(maxsplit=1)) # 結果:['Beautiful', 'is better than ugly.'] print('1,2,3,4'.split(',')) # 結果:['1', '2', '3', '4'] print(','.join(['1', '2', '3', '4'])) # 結果:1,2,3,4 print(':'.join(map(str, range(1, 5)))) # 結果:1:2:3:4 ``` #### 7. 大小寫轉換 | 函式 | 解釋 | |:--:|:--| | `lower()` | 字串中的英文字母全部轉換為 **小寫** 字母 | | `upper()` | 字串中的英文字母全部轉換為 **大小** 字母 | | `capitalize()` | 每個 **句子** 的 **第一個字母** 轉換為 **大寫** 字母 | | `title()` | 每個 **單詞** 的 **第一個** 字母轉換為 **大寫** 字母 | | `swapcase()` | **小寫** 字母轉換為 **大寫** 字母並把 **大寫** 字母轉換為 **小寫** 字母 | ```python text = 'Explicit is better than implicit.' print(text.lower()) # 結果:explicit is better than implicit. print(text.upper()) # 結果:EXPLICIT IS BETTER THAN IMPLICIT. print(text.capitalize()) # 結果:Explicit is better than implicit. print(text.title()) # 結果:Explicit Is Better Than Implicit. print(text.swapcase()) # 結果:eXPLICIT iS bETTER tHAN iMPLICIT. ``` #### 8. 判斷字串開始與結束單詞 > 測試字串是否以指定的一個或幾個字串(放在元組中)開始或結束 | 函式 | 解釋 | |:--:|:--:| | `startswith()` | 開始 | | `endswith()` | 結束 | ```python text = 'Simple is better than complex.' print(text.startswith('simple')) # 結果:False print(text.startswith('Simple')) # 結果:True print(text.endswith(('.', '!', '?'))) # 結果:True ``` #### 9. 刪除字串指定字元 > 刪除字串兩側、右側和左側的空白字元或指定的字元 | 函式 | 解釋 | |:--:|:--:| | `strip()` | 兩側 | | `rstrip()` | 右側 | | `lstrip()` | 左側 | ```python text = ' ======test===##### ' print(text.strip()) # 結果:======test===##### print(text.strip('=# ')) # 結果: