我有一组数据,我想设置一些值彼此太接近的元素为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.如果有人知道如何解决这个问题,请告诉我。感谢!
答案 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,
...
}