有人能告诉我如何从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_image
为C.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)
我能想到这个问题的解决方案是从列表中删除值的一些方法,因此无法再次选择它,但保持索引完整,以便我可以继续循环遍历它并依次删除每个。谁能告诉我这是怎么做到的?
谢谢; - )
答案 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})