Python array 与 bisect

1 min入门

Python array 与 bisect 的完整教学讲解。

array 数组

基本写法:创建数组 array.array(<类型码>, <可迭代>)

# 创建紧凑类型数组
import array

a = array.array("i", [1, 2, 3, 4])  # 有符号整数
b = array.array("f", [1.5, 2.5])     # 单精度浮点
d = array.array("d", [3.14])         # 双精度浮点

基本写法:类型码 "i" | "f" | "d" | "b" | "B" | "u"

# 常用类型码
# b: signed char  B: unsigned char
# i: signed int   I: unsigned int
# f: float        d: double
# u: unicode char(已弃用)
a = array.array("i")
print(a.typecode)

基本写法:追加元素 a.append(<值>) | a.extend(<可迭代>)

# 追加元素
a = array.array("i", [1, 2])
a.append(3)
a.extend([4, 5])

基本写法:插入元素 a.insert(<索引>, <值>)

# 在指定位置插入
a.insert(0, 0)

基本写法:从文件读取 a.fromfile(<文件>, <数量>)

# 从二进制文件读取到数组
with open("data.bin", "rb") as f:
    a.fromfile(f, 100)

基本写法:写入文件 a.tofile(<文件>)

# 数组写入二进制文件
with open("data.bin", "wb") as f:
    a.tofile(f)

基本写法:转换为列表 a.tolist()

# 数组转列表
print(a.tolist())

基本写法:bytes 与 frombytes a.tobytes() | a.frombytes(<字节>)

# 数组与字节转换
data = a.tobytes()
a2 = array.array("i")
a2.frombytes(data)

基本写法:反转与缓冲 a.reverse() | a.buffer_info()

# 反转数组与获取内存信息
a.reverse()
print(a.buffer_info())  # (地址, 长度)

bisect 有序列表

基本写法:bisect 查找插入位置 bisect.bisect(<有序列表>, <值>)

# 查找保持有序的插入位置
import bisect

a = [1, 3, 5, 7, 9]
print(bisect.bisect(a, 4))  # 2

基本写法:bisect_left 左侧插入 bisect.bisect_left(<列表>, <值>)

# 返回左侧插入点
print(bisect.bisect_left(a, 5))  # 2

基本写法:bisect_right 右侧插入 bisect.bisect_right(<列表>, <值>)

# 返回右侧插入点
print(bisect.bisect_right(a, 5))  # 3

基本写法:insort 插入保持有序 bisect.insort(<列表>, <值>)

# 插入元素并保持有序
bisect.insort(a, 4)
print(a)  # [1, 3, 4, 5, 7, 9]

基本写法:insort_left 左侧插入 bisect.insort_left(<列表>, <值>)

# 插入到左侧
bisect.insort_left(a, 5)

基本写法:insort_right 右侧插入 bisect.insort_right(<列表>, <值>)

# 插入到右侧(默认)
bisect.insort_right(a, 5)

基本写法:限定范围查找 bisect.bisect(<列表>, <值>, lo=<起>, hi=<止>)

# 限定查找范围
print(bisect.bisect(a, 4, lo=1, hi=4))

bisect 应用

基本写法:分级映射 bisect.bisect 配合列表

# 按分数定级
def grade(score):
    breakpoints = [60, 70, 80, 90]
    grades = "FDCBA"
    i = bisect.bisect(breakpoints, score)
    return grades[i]

print(grade(85))  # B

基本写法:优先队列(有序插入) bisect.insort

# 用 bisect 维护有序队列
class SortedQueue:
    def __init__(self):
        self._data = []
    def push(self, x):
        bisect.insort(self._data, x)
    def pop(self):
        return self._data.pop(0)

array 与 list 区别

基本写法:内存占用对比 sys.getsizeof(<对象>)

# array 比 list 节省内存
import sys
lst = list(range(1000))
arr = array.array("i", range(1000))
print(sys.getsizeof(lst))  # 较大
print(sys.getsizeof(arr))  # 较小

array 切片与迭代

基本写法:切片 a[<起>:<止>]

# 数组切片返回新数组
sub = a[1:3]
print(type(sub))  # <class 'array.array'>

基本写法:迭代 for <元素> in a:

# 迭代数组元素
for x in a:
    print(x)