我正在开发一种算法,该算法使用肽的排行榜并去除没有特定“分数”的肽。我目前正在努力理解为什么我的删除过程中出现错误。我相信可能与我复制列表有关,然后我会在删除过程中使用它。但是,我在以前的问题中使用了相同的过程,没有问题,所以我不明白为什么这个特定的实例会抛出错误。
def Trim(Leaderboard,Spectra,N):
Scores=[];droplist=[]
for peptide in Leaderboard:
Scores.append(LinearScore(peptide,Spectra))
Leaderboard,Scores = zip(*sorted(zip(Leaderboard, Scores),key=lambda peptide: peptide[1], reverse=True))
Leaderboard=list(Leaderboard);Scores=list(Scores) ### IS THIS WHERE THE PROBLEM IS????
Cutoffscore=Scores[N-1] # Here I am finding the Score of the Nth' peptide (in sorted order)
for peptide,score in zip(Leaderboard,Scores): # iterate through list of tuples
if score<Cutoffscore: # if peptide score is lower than cut off score
droplist.append(peptide) # remove that peptide from the leaderboard
for i in droplist:
Leaderboard.remove(i) ### ERROR THROWN HERE "Error list.remove(x), x not in list"
return Leaderboard # then return what's left of the list
编辑:问题位于程序的其他位置
答案 0 :(得分:1)
new_list = [peptide for peptide,score in zip(Leaderboard,Scores) if score >= CutoffScore]
是一种更好的方法来实现这一点......说你应该向后遍历droplist
for i in reversed(droplist):
Leaderboard.remove(i)
问题在于
考虑分数为[1,5,5,5,5,5,1]
的情况......您的下拉列表中的索引为[0, 6]
然而,一旦你弹出0 ...没有索引6 ...你的其他索引已经转移到5