入門學習筆記2)
1 列表list1.1 核心特性列表是最常用的數(shù)據(jù)類型之一它是一種有序、可變的序列允許元素重復(fù)可以存放不同類型的數(shù)據(jù)。用中括號[]表示。有序元素有固定順序可通過索引訪問可變可以增、刪、改元素可重復(fù)允許相同元素出現(xiàn)多次可混合可存放任意類型的元素1.2 創(chuàng)建方式# 方式1直接使用中括號 lst1 [1, 2, 3, 4] # 方式2list() 構(gòu)造從元組/字符串轉(zhuǎn)換 lst2 list((5, 6, 7)) # 方式3range() 生成 lst3 list(range(1, 6)) # [1, 2, 3, 4, 5] # 方式4列表推導式 lst4 [x * 2 for x in range(5)] # [0, 2, 4, 6, 8] # 方式5空列表 lst5 [] lst6 list()1.3 基本操作增刪改查# 一、列表的創(chuàng)建 lst1 [1, 2, 3, 4] lst2 list((5, 6, 7)) lst3 list(range(1, 6)) # [1, 2, 3, 4, 5] print(lst1:, lst1) print(lst2:, lst2) print(lst3:, lst3) # 二、增 fruits [apple, banana] fruits.append(orange) # 末尾添加單個元素 print(append:, fruits) fruits.insert(1, grape) # 指定位置插入 print(insert:, fruits) fruits.extend([kiwi, pear]) # 末尾批量添加 print(extend:, fruits) # 三、刪 fruits.remove(apple) # 刪除指定值不存在會報錯 print(remove:, fruits) x fruits.pop() # 刪除并返回末尾元素 print(pop 返回:, x, 刪除后:, fruits) x fruits.pop(1) # 刪除并返回指定索引元素 print(pop(1) 返回:, x) del fruits[0] # 通過索引刪除 print(del 后:, fruits) fruits.clear() # 清空列表 print(clear 后:, fruits) # 四、改 nums [10, 20, 30, 40] nums[0] 100 # 按索引修改元素 print(改索引:, nums) nums[1:3] [200, 300] # 切片批量修改 print(改切片:, nums) # 五、查 numbers [5, 8, 2, 9, 1, 8] print(索引訪問 [0]:, numbers[0]) # 5 print(負索引 [-1]:, numbers[-1]) # 1 print(切片 [1:4]:, numbers[1:4]) # [8, 2, 9] print(長度:, len(numbers)) print(8 在列表中?, 8 in numbers) # True print(8 出現(xiàn)次數(shù):, numbers.count(8)) # 2 print(9 的索引:, numbers.index(9)) # 3 # 遍歷 for n in numbers: print(元素:, n) # 排序與反轉(zhuǎn) print(排序:, sorted(numbers)) # [1, 2, 5, 8, 8, 9]1.4 關(guān)鍵要點總結(jié)操作方法說明增append()末尾添加單個增insert(位置, x)指定位置插入增extend()末尾批量添加刪remove(x)按值刪除不存在報錯刪pop(索引)按索引刪除并返回刪del lst[索引]按索引刪除刪clear()清空改lst[索] 值直接賦值修改查in/index()/count()各種查詢易混淆點append(元素)是把元素當一個整體加入extend(列表)是把列表的元素逐個加入remove(值)刪除第一個匹配項pop(索引)按位置刪除sort()原地排序 /sorted()返回新列表2 元組tuple2.1核心特性元組是一種有序、不可變的序列一個重要特性是——一旦創(chuàng)建不能修改不能增、刪、改元素。用小括號()表示。2.2與列表的區(qū)別特性元組()列表[]可變性不可變可變元素順序有序有序是否可以修改不能能內(nèi)存/性能更小更快相對較大用途保護數(shù)據(jù)、字典鍵通用、動態(tài)數(shù)據(jù)2.3 創(chuàng)建方式# 方式1直接使用小括號 t1 (1, 2, 3) # 方式2省略括號逗號是關(guān)鍵 t2 10, 20, 30 # 方式3tuple() 構(gòu)造從列表/字符串轉(zhuǎn)換 t3 tuple([4, 5, 6]) # 方式4單元素元組必須有逗號 t4 (7,) # 是元組 t5 (7) # 只是整數(shù) 7不是元組 # 方式5空元組 t6 () t7 tuple()2.4 基本操作查這也是核心操作索引訪問t[0]切片t[1:3]成員判斷in/not in長度len(t)計數(shù)/索引t.count(x)、t.index(x)遍歷for x in t:2.5 關(guān)鍵要點總結(jié)單元素元組必須有逗號(7)是整數(shù)(7,)才是元組元組不可變沒有增刪改所有方法都不會改變元組本身count/index只讀元組的優(yōu)勢性能更好、可作字典的鍵dict的 key、保護數(shù)據(jù)不被意外修改解包unpackinga, b (1, 2)是元組最常見的用法也用于交換變量可變與不可變對比元組偶爾可包含可變對象如列表但元組自身結(jié)構(gòu)仍不可變3 字典dict3.1 介紹字典是一種以鍵值對key-value的形式存儲數(shù)據(jù)是一種可變、無序無索引順序的集合3.2 創(chuàng)建方式1直接使用大括號創(chuàng)建{}userinfo { name: 張三, # Key-Value對鍵為name值為張三 age: 18, gender: 男 }2使用dict()函數(shù)創(chuàng)建dict2 dict( name張三, # keyvalue age28, gender男 )3.3 基本操作方式操作方法要點增stu[key] value、update()對新 key 賦值即新增update()可一次添加多組刪pop(key)、del、clear()pop會返回被刪的值刪除前建議用in判斷避免KeyError改stu[key] value對已存在的 key 賦值即修改對不存在的 key 賦值則變成新增查stu[key]、get()、in、items()get()更安全key 不存在不報錯還可設(shè)默認值4 集合set4.1 集合的定義集合是一個無序、不重復(fù)的元素序列用大括號{}表示三大特性無序性元素沒有固定順序不能通過索引訪問唯一性自動去重元素不允許重復(fù)可變性集合本身是可變的可以增刪元素但元素必須是不可變的數(shù)字、字符串、元組可以列表、字典不行4.2 創(chuàng)建方式方法示例說明直接使用大括號s {1, 2, 3}最常用set()構(gòu)造s set([1, 2, 3])可將列表、字符串等轉(zhuǎn)為集合set()創(chuàng)建空集s set()注意{}是字典不是空集合4.3 基本操作增刪改查增add(x)添加單個元素update(iterable)批量添加多個元素刪remove(x)刪除指定元素不存在會報錯discard(x)刪除指定元素不存在不會報錯pop()隨機刪除一個元素因為無序clear()清空集合改集合沒有直接的改因為元素無序且不可變。修改 刪除舊元素 添加新元素查in/not in判斷元素是否存在遍歷for x in s:5 推導式與切片技巧5.1 推導式Comprehension推導式是用一行代碼快速生成新容器的語法。有四種列表、集合、字典、生成器。# 一、列表推導式 # 語法: [表達式 for 變量 in 可迭代對象 if 條件] # 基本: 生成1~10的平方 squares [x ** 2 for x in range(1, 11)] print(平方:, squares) # 帶條件: 只保留偶數(shù) evens [x for x in range(1, 21) if x % 2 0] print(偶數(shù):, evens) # 嵌套: 九九乘法表兩層循環(huán) table [f{i}*{j}{i*j} for i in range(1, 4) for j in range(1, 4)] print(乘法表:, table) # 二、集合推導式自動去重 nums [1, 1, 2, 2, 3, 3, 4] s {x for x in nums} print(集合推導:, s) # {1, 2, 3, 4} # 三、字典推導式 # 交換鍵值對 d {a: 1, b: 2, c: 3} new_d {v: k for k, v in d.items()} print(字典推導:, new_d) # {1: a, 2: b, 3: c} # 生成平方表 sq_dict {x: x ** 2 for x in range(1, 6)} print(平方表:, sq_dict) # 四、生成器推導式省內(nèi)存 # 用圓括號惰性求值不一次性占用內(nèi)存 g (x * x for x in range(5)) print(生成器類型:, type(g)) # generator print(逐個取值:, list(g)) # [0, 1, 4, 9, 16] # 五、與普通寫法對比 # 傳統(tǒng)寫法 evens_traditional [] for x in range(1, 21): if x % 2 0: evens_traditional.append(x) # 推導式一行搞定 evens [x for x in range(1, 21) if x % 2 0] print(兩種寫法結(jié)果一致:, evens_traditional evens)5.2 切片技巧Slice切片用于截取序列的一部分語法序列[開始:結(jié)束:步長]適用于列表、元組、字符串。# 切片技巧 # 公式[起始索引:結(jié)束索引:步長] # 起始索引默認0結(jié)束索引默認列表長度步長默認1 # 負數(shù)索引從后往前數(shù)-1表示最后一個元素-2表示倒數(shù)第二個元素以此類推 # 步長為正數(shù)時表示按順序從左到右取元素為負數(shù)時表示按倒序從右到左取元素 # 切片的索引范圍是左閉右開 [ 起始索引, 結(jié)束索引 ) 區(qū)間即不包含結(jié)束索引的元素 # 六、基本切片 lst [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(取前3個:, lst[:3]) # [0, 1, 2] print(從第3個起:, lst[3:]) # [3, 4, 5, 6, 7, 8, 9] print(取中間:, lst[2:5]) # [2, 3, 4] print(取后3個:, lst[-3:]) # [7, 8, 9] # 七、步長(step)技巧 # lst[開始:結(jié)束:步長] print(取偶數(shù)位:, lst[::2]) # [0, 2, 4, 6, 8] print(取奇數(shù)位:, lst[1::2]) # [1, 3, 5, 7, 9] # 八、倒序(經(jīng)典技巧) print(反轉(zhuǎn):, lst[::-1]) # [9, 8, ..., 0] # 九、修改切片 lst2 [0, 1, 2, 3, 4, 5] lst2[1:4] [100, 200, 300] # 用切片賦值修改 print(修改切片:, lst2) # [0, 100, 200, 300, 4, 5] lst3 [0, 1, 2, 3, 4] lst3[1:3] [] # 用切片刪除 print(切片刪除:, lst3) # [0, 3, 4] # 十、字符串切片應(yīng)用 s Hello, World print(取單詞:, s[7:]) # World print(反向字符串:, s[::-1]) # dlroW ,olleH # 判斷回文 word madam print(是否回文:, word word[::-1]) # True5.3 核心技巧速記切片寫法作用seq[:n]/seq[-n:]取前 n 個 / 取后 n 個seq[::2]取偶數(shù)位置步長應(yīng)用seq[::-1]反轉(zhuǎn)序列最常用技巧seq[start:end:step]完整切片語法推導式 vs 普通循環(huán)推導式更簡潔高效追求可讀性時控制在一層循環(huán)一個條件內(nèi)邏輯復(fù)雜時用傳統(tǒng)循環(huán)更好讀。6 復(fù)雜序列數(shù)據(jù)處理現(xiàn)實中數(shù)據(jù)往往不是單一類型而是多層嵌套多個序列組合。# 一、嵌套序列列表套列表/字典 # 二維列表類似表格 matrix [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] print(第1行第2列:, matrix[0][1]) # 2 # 遍歷二維列表 for row in matrix: print(行:, row) # 列表套字典常見于數(shù)據(jù)記錄 students [ {name: 張三, score: 90}, {name: 李四, score: 85}, {name: 王五, score: 78}, ] for stu in students: print(f{stu[name]} 考了 {stu[score]} 分) # 二、enumerate同時拿索引和值 fruits [apple, banana, orange] for i, f in enumerate(fruits): print(f索引{i}: {f}) # 還可指定起始編號 for i, f in enumerate(fruits, start1): print(f第{i}個: {f}) # 三、zip多個序列打包 names [張三, 李四, 王五] scores [90, 85, 78] # 打包成元組對 pairs list(zip(names, scores)) print(zip打包:, pairs) # [(張三, 90), ...] # 結(jié)合字典 - 一行生成成績字典 score_dict dict(zip(names, scores)) print(成績字典:, score_dict) # 遍歷多個序列 for name, score in zip(names, scores): print(f{name}: {score}) # zip(*列表) 解包轉(zhuǎn)置 —— 經(jīng)典技巧 data [(1, 2, 3), (4, 5, 6)] a, b, c zip(*data) print(轉(zhuǎn)置:, a, b, c) # (1, 4) (2, 5) (3, 6) # 四、解包unpacking技巧 nums [1, 2, 3, 4, 5] first, *middle, last nums print(首:, first, 中間:, middle, 尾:, last) # 五、實戰(zhàn)學生成績分析 grades [ {name: 張三, subjects: {語文: 90, 數(shù)學: 85, 英語: 78}}, {name: 李四, subjects: {語文: 88, 數(shù)學: 92, 英語: 95}}, {name: 王五, subjects: {語文: 70, 數(shù)學: 75, 英語: 80}}, ] # 計算每人平均分 for stu in grades: scores stu[subjects].values() avg sum(scores) / len(scores) print(f{stu[name]} 平均分: {avg:.2f}) # 找出所有科目中的最高分 all_scores [s for stu in grades for s in stu[subjects].values()] print(全班最高分:, max(all_scores)) # 按平均分排序sorted 匿名函數(shù) def get_avg(stu): return sum(stu[subjects].values()) / len(stu[subjects]) ranking sorted(grades, keyget_avg, reverseTrue) print(第一名:, ranking[0][name])核心工具速查表工具作用典型用法enumerate()同時獲取索引值for i, v in enumerate(lst)zip()多個序列按位打包dict(zip(keys, values))zip(*data)轉(zhuǎn)置解包二維數(shù)據(jù)行列互換*args解包拆分序列first, *mid, last lstsorted(key...)按自定義規(guī)則排序配合匿名函數(shù)關(guān)鍵要點嵌套取值多維數(shù)據(jù)用連續(xù)索引如matrix[0][1]字典用鍵如stu[name]zipdict是拼接鍵值對的最快捷方式zip(*data)是轉(zhuǎn)置的經(jīng)典技巧enumerate取代手動維護索引計數(shù)器代碼更清晰列表推導式的嵌套[s for stu in grades for s in stu[subjects].values()]可扁平方多維數(shù)據(jù)但控制嵌套在 2 層以內(nèi)保持可讀性sorted(key函數(shù))支持對復(fù)雜對象字典、元組列表按任意字段排序7.各個數(shù)據(jù)類型不同特性字符串 str元組 tuple列表 list字典 dict集合 set定義符號...或...(...)[...]{鍵: 值}{...}示例abc(1, 2, 3)[1, 2, 3]{a: 1}{1, 2, 3}可變性不可變 ?不可變 ?可變 ?可變 ?可變 ?元素順序有序有序有序有序Python 3.7 按插入序無序可重復(fù)元素允許允許允許鍵唯一、值可重復(fù)不允許自動去重下標索引?s[0]?t[0]?l[0]?用鍵訪問d[a]?切片?s[1:3]?t[1:3]?l[1:3]??元素類型只能存字符任意任意鍵任意、值任意必須是可哈希的重復(fù)添加/更新拼接生成新串拼接生成新串a(chǎn)ppend/insert/[i]d[key] valueadd()刪除不可刪除部分切片可得新串不可刪除部分remove/pop/deldel d[key]/popdiscard/remove/pop去重用需set()轉(zhuǎn)換需set()轉(zhuǎn)換需set()轉(zhuǎn)換本身鍵唯一? 天生去重查找快索引快索引快索引非常快哈希鍵查找非常快哈希查找可否作為字典的鍵??元素也要可哈希?可變不可哈希??常用方法/特點upper()、split()、join()打包、不可變安全、可做鍵append、sort、indexkeys()、values()、items()、get()union、intersection、注意:尤其注意可變和有序這些,不能搞混