'float'对象不支持删除项目

时间:2014-09-02 21:05:20

标签: python typeerror

我正在尝试浏览列表并删除不符合特定阈值的元素但我在尝试删除时收到错误'float' object does not support item deletion

为什么我收到此错误?无论如何都要删除像浮动这样的列表中的项目吗?

相关守则:

def remove_abnormal_min_max(distances, avgDistance):

    #Define cut off for abnormal roots
    cutOff = 0.20 * avgDistance # 20 percent of avg distance

    for indx, distance in enumerate(distances): #for all the distances

        if(distance <= cutOff): #if the distance between min and max is less than or equal to cutOff point

            del distance[indx] #delete this distance from the list

    return distances

2 个答案:

答案 0 :(得分:2)

list floatdistances值被称为float(复数),该序列中的每个distance值都称为del distance[indx](单数)。< / p>

你试图使用后者,而不是前者。 float失败,因为这是list值,而不是s对象。

您需要做的就是添加缺少的del distances[indx] # ^

i + 1

但是,现在您正在修改列表到位,在循环时将其缩短。这会让你错过元素;曾经位于i位置的项目现在位于i + 1,而迭代器在distances = [d for d in distances if d > cutOff] 处继续愉快。

解决方法是使用您想要保留的所有内容构建一个新的列表对象:

{{1}}

答案 1 :(得分:1)

您在评论中提到需要重复使用已删除距离的索引。您可以使用列表解析一次构建所需的所有indx列表:

indxs = [k for k,d in enumerate(distances) if d <= cutOff]

然后你可以迭代这个新列表来完成你需要的其他工作:

for indx in indxs:
    del distances[indx]
    del otherlist[2*indx, 2*indx+1] # or whatever

您也可以将其他作品按照另一个列表理解:

indxs = [k for k,d in enumerate distances if d > cutOff] # note reversed logic
distances = [distances[indx] for indx in indxs] # one statement so doesn't fall in the modify-as-you-iterate trap
otherlist = [otherlist[2*indx, 2*indx+1] for indx in indxs]

顺便说一句,如果您使用的是NumPy,它是Python的数字和科学计算包,您可以利用布尔数组及其所谓的smart indexing并使用{{1} }直接访问你的列表:

indxs