我有一份布尔值列表。我还有一个开始和结束指数列表。在我的布尔列表中,我希望每个值都是True
,除非它位于索引列表中定义的切片之一。我写的内容非常笨重,有什么建议让它更好吗?
bools = [True] * 15
events = [(3, 5), (11, 16)]
for e in events:
bools[e[0]:e[1]] = [False for x in range(*e)]
具体来说,我不喜欢[False for x in range(*e)]
部分。如果我开始搞乱切片,range(*e)
开始变得混乱,例如:
bools[e[0]:e[1]+2] = [False for x in range(e[0], e[1]+2)]
如果有一种语法可以使列表/切片中的每个值采用相同的值,那将是非常好的,例如
bools[e[0]:e[1]+2] = False
但显然这不是正确的语法。有什么想法吗?
答案 0 :(得分:1)
from itertools import repeat
for e in events:
bools[e[0]: e[1]] = repeat(False, e[1] - e[0])
答案 1 :(得分:0)
有兴趣使用numpy吗?
bools[e[0]:e[1]+2] = False
在numpy工作。您也可以直接创建自己的slice objects,这样可以让您执行此类操作
slices = [np.s_[3:6], np.s_[11:17]]
for s in slices:
bools[s] = False
使用s_完全支持切片语法(步长,从列表末尾索引,省略号),而不仅仅是枚举范围
答案 2 :(得分:0)
我只是这样做:
events = [(3, 5), (11, 16)]
bools = [True] * 16
for start, end in events:
for index in range(start, end):
bools[index] = False