Python:为什么我不能从列表中弹出一个值?

Python:为什么我不能从列表中弹出一个值?,python,list,python-3.x,Python,List,Python 3.x,我不确定这里到底发生了什么。我尽量说得具体一些。有人能告诉我为什么这不起作用吗?当我试图从循环中显示在一个列表中的项目弹出时,我得到了一个弹出索引超出范围的错误。我在大学里学的。非常感谢。我真的希望这不是一个愚蠢的问题。输出如下 def k_largest(a_list,k): compare_list =[] a_list.sort() #print(a_list) for item in a_list: assert(type(item)

我不确定这里到底发生了什么。我尽量说得具体一些。有人能告诉我为什么这不起作用吗?当我试图从循环中显示在一个列表中的项目弹出时,我得到了一个弹出索引超出范围的错误。我在大学里学的。非常感谢。我真的希望这不是一个愚蠢的问题。输出如下

def k_largest(a_list,k):

    compare_list =[]

    a_list.sort()
    #print(a_list)

    for item in a_list:
        assert(type(item)==int) #the list can only contain integers

        if item in compare_list and item in a_list:
                print("pop a_list " + str(item))
                print(a_list)
                a_list.pop(item)
        else:
            if item not in compare_list:
                print("compare append " + str(item))
                compare_list.append(item)


    #print(a_list)
    #print(len(a_list))
    return a_list[len(a_list)-k]





import random
a=[]
for x in range(1,10):
    a.append(random.randint(0,100))
print (a)
k_largest(a,3)
输出:

[38, 38, 25, 25, 7, 60, 5, 35, 97]
compare append 5
compare append 7
compare append 25
pop a_list 25
[5, 7, 25, 25, 35, 38, 38, 60, 97]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-141-a73ef6b20848> in <module>()
      4     a.append(random.randint(0,100))
      5 print (a)
----> 6 k_largest(a,3)

<ipython-input-137-a9f599ea78c6> in k_largest(a_list, k)
     12                 print("pop a_list " + str(item))
     13                 print(a_list)
---> 14                 a_list.pop(item)
     15         else:
     16             if item not in compare_list:

IndexError: pop index out of range

list.pop获取要删除的元素的索引,而不是要删除的项的索引。尝试改用list.remove。

如Python文档所述:

array.pop[i]

从数组中删除索引为i的项并返回它。这个 可选参数默认为-1,因此默认情况下最后一项为 移除并返回


您需要提到使用array.pop的索引号

pop采用索引,而不是项目。不管怎样,你可能不应该在迭代列表时从列表中弹出东西,它通常以悲伤结束。我同意@tzaman-See。大多数情况下,你可以做一个列表理解来达到同样的效果。谢谢你的耐心和清晰的回答!非常感谢。