當前位置:
首頁 >
流畅的Python 2. 数据结构 - 序列构成的数组
發布時間:2024/7/5
48
豆豆
生活随笔
收集整理的這篇文章主要介紹了
流畅的Python 2. 数据结构 - 序列构成的数组
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 內置序列
- 2. 列表推導 []、生成器() 表達式
- 3. 元組 tuple
- 4. 切片
- 5. `+, *` 操作
- 6. 增量賦值
- 7. 排序
- 8. bisect管理已排序序列
- 8.1 用 bisect.bisect 二分搜索
- 8.2 用 bisect.insort 二分插入新元素
- 9. 列表的替代
- 9.1 數組
- 9.2 內存視圖
- 9.3 NumPy、SciPy
- 9.4 隊列
1. 內置序列
- 容器序列:list, tuple, collections.deque 能存放不同類型的數據,存放的是對象的引用
- 扁平序列:str, bytes, bytearray, memoryview, array.array 只能存一種類型,存放的是值(只能存字符、字節、數值這種基礎類型)
按照是否可修改:
- 可變序列:list,bytearray,array.array,collections.deque,memoryview
- 不可變序列:tuple, str, bytes
2. 列表推導 []、生成器() 表達式
- 列表推導有自己的局部作用域
- 列表推導式,只能生成列表類型
生成器表達式
- 逐個的產出元素,背后遵守了迭代器協議,相比 列表 去初始化其他類型,生成器表達式 更節省內存,它不會一次性產生全部的組合
- 語法跟列表推導差不多,把 [ ] 改成 ( )
3. 元組 tuple
- 不可變的列表
- 還可用于 沒有字段名的記錄
- 元組拆包 %, = 必須保證兩側的元素數量一樣,不一樣多,可以使用 * 忽略多余元素
- * 代替多個元素
- 嵌套元組拆包
- 有名字的元組 collections.namedtuple ,構建一個帶字段名的元組和一個有名字的類
- 其構建的實例比普通對象小一些,因為它不會用 __dict__ 來存放屬性
4. 切片
像 list, tuple, str 等序列類型都支持切片
- seq[start:stop:step] 從 start 開始,到 stop(不包含)結束,每間隔 step 個取一次,其調用seq.__getitem__(slice(start, stop, step))
- 給切片賦值(迭代對象),就地修改
5. +, * 操作
- 使用 + * ,拼接,產生新的序列
- 注意 不要在 [[list]]*n 外側乘以 n ,它們 n 個都指向同一個list
6. 增量賦值
- +=,*= 等,+= 背后對應于 __iadd__() 就地加法,如果類沒有實現這個方法,會調用 __add__()
7. 排序
- list.sort() 就地排序,返回 None,沒有復制
- 內置函數 sorted() ,會新建一個列表返回
- 都有關鍵字,reverse 默認False升序, key排序函數(自定義,len,str.lower)
8. bisect管理已排序序列
8.1 用 bisect.bisect 二分搜索
def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'):i = bisect.bisect(breakpoints, score)# bisect同bisect_right,相等的話返回后面的位置return grades[i]ans = [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]] # bisect_left ['F', 'A', 'C', 'D', 'B', 'B', 'A'] # bisect_right ['F', 'A', 'C', 'C', 'B', 'A', 'A'] print(ans)8.2 用 bisect.insort 二分插入新元素
insort(seq, item) 把變量 item 插入到序列 seq 中,并能保持 seq 的升序順序
import random, timerandom.seed(time.time()) l = [] for i in range(7):new_item = random.randrange(20)bisect.insort(l, new_item)print('{:2} ->'.format(new_item), l) # 17 -> [17] # 0 -> [0, 17] # 16 -> [0, 16, 17] # 6 -> [0, 6, 16, 17] # 13 -> [0, 6, 13, 16, 17] # 14 -> [0, 6, 13, 14, 16, 17] # 1 -> [0, 1, 6, 13, 14, 16, 17]9. 列表的替代
9.1 數組
- 只包含數字的列表,array.array 比 list 更高效,支持所有可變序列的操作
- 還可以 從文件讀取 和 存入文件,.frombytes,.tofile
pickle.dump 幾乎可以處理所有內置數字類型(復數,嵌套集合,自定義類)
9.2 內存視圖
- 不復制,操作內容
9.3 NumPy、SciPy
略
9.4 隊列
- 列表在 頭部 pop,或者 insert 時,比較費時,會移動元素
- collections.deque 類(雙向隊列)是一個線程安全、可以快速從兩端添加或者刪除元素的數據類型
- 還有一些 PriorityQueue,Queue,LifoQueue,heapq等隊列
總結
以上是生活随笔為你收集整理的流畅的Python 2. 数据结构 - 序列构成的数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 2131. 连接两字母
- 下一篇: python 全局变量、局部变量