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