从列表中删除(POPing)特定元素

时间:2016-09-26 12:04:41

标签: python

我正在使用Python(3.5)中的pop()函数进行书籍练习。说明是使用pop()从列表中删除元素。从下面的列表中,我想删除n1,n4,n5,n6,n7,n8,n9。下面的代码工作,但非常实用)我不明白为什么特定的索引只能工作到[5]。没有使用循环(我还没有),从列表中弹出特定元素的正确方法是什么?

nameList = ['n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7', 'n8', 'n9']
print('I can only invite two people to dinner...')

print('Sorry, but ', nameList.pop(0).title(), ' will not be invited to 
       dinner') 
print('Sorry, but ', nameList.pop(3).title(), ' will not be invited to
      dinner')
print('Sorry, but ', nameList.pop(4).title(), ' will not be invited to
      dinner') 
print('Sorry, but ', nameList.pop(5).title(), ' will not be invited to
      dinner') 
print('Sorry, but ', nameList.pop(-1).title(), ' will not be invited to
      dinner')
print('Sorry, but ', nameList.pop(-1).title(), ' will not be invited to
      dinner')
print('Sorry, but ', nameList.pop(-1).title(), ' will not be invited to
      dinner') 

4 个答案:

答案 0 :(得分:2)

输出结果为:

I can only invite two people to dinner...
('Sorry, but ', 'N1', ' will not be invited todinner')
('Sorry, but ', 'N5', ' will not be invited to dinner')
('Sorry, but ', 'N7', ' will not be invited to dinner')
('Sorry, but ', 'N9', ' will not be invited to  dinner')
('Sorry, but ', 'N8', ' will not be invited to  dinner')
('Sorry, but ', 'N6', ' will not be invited to   dinner')
('Sorry, but ', 'N4', ' will not be invited to   dinner')

让我们看看:

首先,您的列表包含9个元素。您使用pop(0)删除第一个,所以现在您有一个包含8个元素的列表:

['n2', 'n3', 'n4', 'n5', 'n6', 'n7', 'n8', 'n9']

不是你从这个' new'中移除了第3个元素。 list,n5(记住索引从0开始)

等等......

每次删除后,列表会更短,所以即使在第一次删除后,第8个位置的元素也会被删除(这种情况发生在你的情况下的pop(5)之后)。

没有'一般'从列表中删除元素的方法,但请注意列表是可变变量。

答案 1 :(得分:1)

嗯,每次使用'pop'时,nameList的长度都会动态变化。 因此,在弹出4个元素(n1,n4,n5,n6)之后,nameList中只剩下5个元素。 你不能再使用pop(5),因为当时索引超出了范围。

答案 2 :(得分:0)

特定索引就像所有索引的魅力一样达到列表大小。你遇到的问题是,当你从列表中删除一个元素时,你会缩小它,每次弹出时大小都会减少1.

假设您有3个元素的列表,l = ["a","b","c"] 您弹出第一个l.pop(0),它将返回"a",但它也会修改列表,以便现在l等于["b","c"]。 相反,如果您使用l.pop(2)l.pop(-1)弹出最后一项(因为Python也允许您计算最后一项中的元素,因此-1始终是列表的最后一项),会得到"c"而列表l会变成["a","b"]。 请注意,在这两种情况下,列表都缩小了,只剩下两个元素,因此您现在无法弹出元素编号2,因为没有这样的东西。

如果要读取元素而不是从列表中删除它,请使用myList[elementIndex]语法。例如,在您的示例中,nameList[6]将返回"n7",但它根本不会修改列表。

答案 3 :(得分:0)

这是因为每次从列表中弹出元素时,列表长度都会更改。因此,如果您想特别使用pop,删除指定的元素将是一个简单而棘手的方法:

>>> nameList = ['n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7', 'n8', 'n9']
>>>
>>> nameList.pop(nameList.index('n1'))
'n1'
>>> nameList.pop(nameList.index('n4'))
'n4'
>>> nameList.pop(nameList.index('n5'))
'n5'
>>> nameList.pop(nameList.index('n6'))
'n6'
>>> nameList.pop(nameList.index('n7'))
'n7'
>>> nameList.pop(nameList.index('n8'))
'n8'
>>> nameList.pop(nameList.index('n9'))
'n9'
>>> nameList
['n2', 'n3']   

因为您可以看到我们每次弹出一个元素时都会指定其index,因此我们不会遇到列表长度发生变化的问题 - 因为使用index我们会得到新的元素的索引!正如您所见,结果将是:['n2', 'n3']正如预期的那样!