2014-09-05 71 views
0

任何人都可以告诉我如何从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“POP操作” (我认为)

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)

,我能想到的这个问题是一些方法来从列表中删除该值的解决方案,所以不能再次选择,但要保持索引完好,以便我可以继续循环并逐个删除。谁能告诉我这可能是怎么完成的?

感谢;-)

+0

使用全部五张图像后会发生什么?你想再次通过吗?在相同的顺序,还是相差一个?有很多更好的方法可以做到这一点(对指数进行硬编码是一个不好的举措),但这种方法将取决于您的目标。 – jonrsharpe 2014-09-05 11:05:52

+0

当他们浏览完所有5张图片后,他们会简单地移动到SessionWizardView的下一页(用于将表格分割成多页),这是一个多项选择问题。 – Deepend 2014-09-05 11:08:59

回答

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}) 
+0

第一个解决方案的魅力。我的代码非常冗长,但我希望稍后在CodeReview上添加一些代码以寻求改进。感谢您的解决方案,非常优雅 – Deepend 2014-09-05 11:26:24

相关问题