使用索引

时间:2015-08-13 15:11:08

标签: python list

我想从列表中按索引删除部分。即从索引12:90和索引100:120等。

我知道如果我从列表的开头到结尾进行迭代,我就无法修改我循环的列表,所以我尝试从列表的末尾循环到开头。这不起作用,因为我似乎无法访问我的反向列表中的不同元素。

这是我目前的测试代码我认为我想要发生的事情很明显,但我收到了错误消息:TypeError: 'reversed' object has no attribute '__getitem__'

a = [5,7,23,5,2,6,2,7,98,3]
indexs = 0,2,5,7
widened_excluder = reversed(indexs)

for i in widened_excluder:
    if i != len(indexs)-1:
        start = widened_excluder[i+1]
        end = widened_excluder[i]
        del a[start:end]

修改 这是我使用(使用实际数据时)获取我想要排除的范围的函数:

def zero_excluder(curve, lnO, ts):
    indexs = curve.nonzero()
    indexs = indexs[0]
    zero_gap = []
    for i in indexs:
        if i > 5 and i < len(indexs) - 6:
            if indexs[i] - indexs[i-1] > 2:
                zero_gap.append([indexs[i-6], indexs[i+5]])
    for pair in zero_gap:
        start = pair[0]
        end = pair[1]+1
        del 

    lnO = lnO[indexs]
    ts = ts[indexs]
    return lnO, ts

2 个答案:

答案 0 :(得分:0)

在您的情况下逐个删除元素是不好的,因为它几乎不会达到性能。切片语法可能会起到作用:

l = range(200)
l2 = l[:12] + l[90:100] + l[120:]

答案 1 :(得分:0)

如果要排除多个范围并且可以使用numpy,最简单的方法是创建一个掩码并将其应用于数据副本。对于您想要保留的元素,面具会True;对于您不想要的元素,面具会False

# your data
arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# slices you want to delete, i.e. 'zero_gap'
slices = [[2, 4], [7, 9]]

# create a mask of Trues and turn off elements
# that you want to remove
mask = np.ones(len(arr), dtype=np.bool)
for s in slices:
    mask[s[0] : s[1] + 1] = False

# apply a mask
remaining = np.copy(arr)[mask]
print remaining # [0, 1, 5, 6, 10]