2012-08-30 80 views
1

當我運行下面的代碼,我得到一個錯誤:簡單的Python嵌套循環 - 索引超出範圍

def genSet(nums): 
    for i in range(0, len(nums)-1): 
     for x in range(0, len(nums)-1): 
      if nums[x] == nums[i]: 
       del nums[x] 
    return nums 

a = [5, 4, 3, 5, 6, 7, 8, 5, 4, 3] 
print genSet(a) 

輸出:

Traceback (most recent call last): 
    File "49.py", line 9, in <module> 
    print genSet(a) 
    File "49.py", line 4, in genSet 
    if nums[x] == nums[i]: 
IndexError: list index out of range 

據我可以告訴(我更換了如果聲明「print x,i」)兩個for循環都很好,那麼爲什麼索引超出範圍?

+0

你不能循環播放列表中的'del'。 – georg

+2

@ thg435:那麼,你可以,但如果你這樣做,可能會發生意想不到的事情。 –

+2

@Tim:「嗯,兒子,你可以玩火柴,但意想不到的事情可能會發生」)) – georg

回答

5

不做del nums[x],因爲這樣你做nums更短,從而得到一個例外。

你可以簡單地做一組淘汰之列由set_nums = set(nums)

+0

太棒了。謝謝! – babbaggeii

3

您正在從nums中刪除元素,因此它變得更短,並且發生IndexError。

無論如何,您的代碼會刪除所有內容,因爲每個元素在列表中都有至少一個相同的元素(本身!)。如果你想創建元素的「獨一無二」的列表中,打造一個集:

unique_set = set(nums) 

,並將其轉換再次列出:

unique_list = list(set(nums)) 
0

你可以找到索引,其中數字是一樣的,讓你列表的numpy的陣列nums = np.array(nums)和使用np.delete命令。

0

你給的例子可以用一個一行代碼,簡單地更換:

print set([5, 4, 3, 5, 6, 7, 8, 5, 4, 3]) 

如果我真的想在列表中篩選出重複自己,我想:

nums = sorted([5, 4, 3, 5, 6, 7, 8, 5, 4, 3]) 
print reduce(lambda x,y:(y not in x and x+[y]) or x, nums, [])