从列表中删除值/项,但保持索引不变

时间:2014-09-05 11:00:50

标签: python-2.7

有人能告诉我如何从Python2.7 / Django1.6.2列表中删除项目,同时保持索引完好无损吗?

我希望能够多次遍历列表并使用原始索引删除项目。我认为我在下面尝试实现的目标相当普遍,但我不知道它的名称。

或者也许是解决以下问题的更好方法?

原始列表

images = ['A.jpg', 'B.jpg', 'C.jpg', 'D.jpg', 'E.jpg']

上述指数为0, 1, 2, 3, 4

如果我使用例如images.pop(2)它似乎删除了索引和值。当多次循环遍历列表以删除不同的项目时,这会导致问题,因为原始声明的索引和值不匹配。

class SurveyWizardOne(SessionWizardView):    

def get_context_data(self, form, **kwargs):
    context = super(SurveyWizardOne, self).get_context_data(form, **kwargs)                 
    if self.steps.current == '5':
        display_image = random.choice(images)                     
        context.update({'display_image': display_image})                                          
        if display_image == 'A.jpg':
            images.pop(0)  
        elif display_image == 'B.jpg':
            images.pop(1)
        elif display_image == 'C.jpg':
            images.pop(2)
        elif display_image == 'D.jpg':
            images.pop(3)
        elif display_image == 'E.jpg':
            images.pop(4)

因此,在上述情况下,如果display_imageC.jpg,那么它就会变得非常有用。从列表中使用images.pop(2)

更新列表

images = ['A.jpg', 'B.jpg', 'D.jpg', 'E.jpg']

上面的索引现在是0, 1, 2, 3(我认为)

    if self.steps.current == '6':
        display_image = random.choice(images)                     
        context.update({'display_image': display_image})                                          
        if display_image == 'A.jpg':
            images.pop(0)  
        elif display_image == 'B.jpg':
            images.pop(1)
        elif display_image == 'C.jpg':
            images.pop(2)
        elif display_image == 'D.jpg':
            images.pop(3)
        elif display_image == 'E.jpg':
            images.pop(4)

但是,如果第二次在列表display_image中循环D.jpg,我应该使用images.pop(2),但我的解决方案是images.pop(3)

我能想到这个问题的解决方案是从列表中删除值的一些方法,因此无法再次选择它,但保持索引完整,以便我可以继续循环遍历它并依次删除每个。谁能告诉我这是怎么做到的?

谢谢; - )

1 个答案:

答案 0 :(得分:1)

最小的变化是remove(取值),而不是pop(取索引):

if self.steps.current == '6':
    display_image = random.choice(images)                     
    context.update({'display_image': display_image}) 
    images.remove(display_image)

这样您就不必对列表中的位置进行硬编码。或者,随机选择索引:

if self.steps.current == '6':
    index = random.randrange(len(images))
    display_image = images.pop(index)                     
    context.update({'display_image': display_image})