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。

posted @ 2026-11-11 00:18  贝壳bkshell  阅读(4)  评论(0)    收藏  举报