2014-09-05 70 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

相關問題