bool-hybrid-array 替换掉 list[bool] 之后,下标取值、切片、赋值还顺手吗?
聊个很多人上手时最关心的问题:手上那一长串 list[bool],换成 bool-hybrid-array 之后,原来那套 arr[i]、切片、arr[i]=v 的写法还顶不顶用?结论先放这儿——常用的下标语义基本都对齐了,不用把老代码里的取值翻个底朝天。
一、先把数组建起来
官方就三个入口,按数据来源挑:
from bool_hybrid_array import *
# 从已有布尔列表构造
arr = BoolHybridArr([True, False, True, False, True])
# 全 True
arr2 = TruesArray(3)
# 全 False
arr3 = FalsesArray(3)
注意别去自己拼主类 BoolHybridArray(size=...),README 里走的就是上面这三个工厂函数。
二、下标取值和切片
取值跟 list 一样直接 arr[0]:
print(arr[0]) # 输出: True;
print(arr[1:4]) # 输出: BoolHybridArr([False, True, False]);
print(arr2) # 输出: BoolHybridArr([True, True, True]);
print(arr3) # 输出: BoolHybridArr([False, False, False]);
切片回来的不是裸 list,而是一个新的 BoolHybridArr,接着往下传、再切片都没问题。
三、改元素
位置赋值也照旧:
arr[2] = False
print(arr) # 输出: BoolHybridArr([True, False, False, False, True])
四、几个常用查询,省得自己写循环
print(arr.count(True)) # True 的个数
print(any(arr)) # 有没有至少一个 True
print(all(arr)) # 是不是全 True
arr_find = BoolHybridArr([i % 2 for i in range(10)])
print(arr_find.find(True)) # [1, 3, 5, 7, 9]
print(arr_find.index(True)) # 第一个 True 的位置: 1
print(arr_find.rindex(True)) # 最后一个 True 的位置: 9
拷贝用 copy(),改拷贝不影响原数组:
arr_copy = arr.copy()
arr_copy[0] = False
print(arr[0]) # True(原数组不变)
print(arr_copy[0]) # False(拷贝数组已修改)
五、容易踩的两个小坑
- 空数组查下标:
BoolHybridArr([])上直接index(True)会抛ValueError:无法在空的 BoolHybridArray 中查找元素,用之前先判空。 - 切片返回的是 BHA 不是 list:要是下游函数硬要吃 Python 原生 list,记得显式转一下,别拿切片直接当 list 用。
小结
从 list[bool] 迁过来,取值、切片、赋值、计数、查找这一套基本顺着原来的肌肉记忆走;真正需要留意的是切片类型和空数组边界。稀疏场景下省内存的活儿交给它自己的 dense/sparse 混合存储,业务代码这层语义不用跟着改。
版本:bool-hybrid-array 9.13.11,许可证 Apache-2.0 OR MulanPSL-2.0,要求 Python >=3.8,硬依赖 numpy>=1.19.0。
浙公网安备 33010602011771号