在列表切片中插入重复值

时间:2013-11-12 02:04:11

标签: python

我有一份布尔值列表。我还有一个开始和结束指数列表。在我的布尔列表中,我希望每个值都是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

但显然这不是正确的语法。有什么想法吗?

3 个答案:

答案 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