Python列表元素消除:IndexError:列表索引超出范围

时间:2017-06-23 09:18:48

标签: python list indexing

我有一组数据,我想设置一些值彼此太接近的元素为0.所以假设我有一个阈值T=1。如果list[i+1] - list[i] < T*2,则会将list[i]元素设置为0.我已编写如下代码:

a = [9, 39, 46, 76, 84, 114, 122, 150, 151, 152, 155, 198, 210]
T=1

def sort (item):
    for i in range(len(item)):
        if item[i] - item[i+1] < 2*T:
            item[i+1] == 0
    return item

print (sort(a)) 

但是,当我运行此代码时,它会给我一个错误:

IndexError: list index out of range.

我想要的输出是:

a = [9, 39, 46, 76, 84, 114, 122, 0, 0, 0, 155, 198, 210]

如上所示,它将150,151,152设置为0.如果有人知道如何解决这个问题,请告诉我。感谢!

2 个答案:

答案 0 :(得分:1)

a = [9, 9, 46, 76, 84, 114, 122, 150, 151, 152, 155, 198, 199]
T=1

def make_zero(arr, T):
    index_values = []
    for i in range(0, len(arr)):
        if i == 0:
            if abs(arr[i] - arr[i+1]) < 2*T:
                index_values.append(i)
        elif i == len(arr):
            if abs(arr[i] - arr[i-1]) < 2*T:
                index_values.append(i)
        elif abs(arr[i] - arr[i-1]) < 2*T:
            index_values.append(i)
        elif abs(arr[i] - arr[i+1]) < 2*T:
            index_values.append(i)
    for j in index_values:
        arr[j] = 0
    return arr

output = make_zero(a,T)
print output

答案 1 :(得分:0)

现在根据您的更新,我找到了一个天真的解决方案:

def set_neighbours_to_zero(input, threshold=1):
    # calculate the distance between the list items
    distance = {(input[i], input[i+1]): input[i+1] - input[i]
        for i in range(len(input) - 1) if i < len(input) - 1}
    # get all too close neighbours
    nullable = set()
    for k,v in distance.items():
        if v < 2 * threshold:
            nullable.update(k)
    # in the last step set the close neighbours to zero
    for n in nullable:
        index = input.index(n)
        input[index] = 0
    # return the modified list
    return input

如果你运行该函数,它应该返回:

a = [9, 39, 46, 76, 84, 114, 122, 150, 151, 152, 155, 198, 210]
print(set_neighbours_to_zero(a))
>>> [9, 39, 46, 76, 84, 114, 122, 0, 0, 0, 155, 198, 210]

我的方法是获取列表中所有相邻数字之间的距离。稍后我们可以将距离低于阈值的所有neigbhours设置为零。 此方法假定输入列表始终按升序排序,其元素为整数。

看起来有点笨拙,但我希望你能改进它。

编辑:

这一部分可以缩短:

# calculate the distance between the list items
distance = {(input[i], input[i+1]): input[i+1] - input[i]
   for i in range(len(input) - 2)}

我们希望获得一个数字与其连续neihgbour之间的距离。由于列表中的最后一个数字没有连续的邻居,我们可以从第一个到第二个到最后一个数字进行迭代。 这是字典理解,并将tupples作为键返回,其中距离为值。例如:

{
    (9, 39): 30,
    (39, 46): 7,
    ...
}