我正在尝试浏览列表并删除不符合特定阈值的元素但我在尝试删除时收到错误'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
答案 0 :(得分:2)
list
float
个distances
值被称为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