2012-08-30 3 views
1

중 인덱스, 나는 오류가 발생 :간단한 파이썬 중첩 루프 나는 다음과 같은 코드를 실행하면 범위

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 

(내가 대체 if 문을 "print x, i"와 함께 사용하면 두 개의 for 루프가 정상적으로 작동하므로 인덱스가 범위를 벗어나는 이유는 무엇입니까?

+0

당신은 할 수 없습니다 목록에서'del'을 반복합니다. – georg

+2

@ thg435 : 글쎄, 할 수는 있어도 그래도 예상치 못한 일이 발생할 수 있습니다. –

+2

@ 팀 : "글쎄, 아들, 너는 경기를 할 수 있지만 예상치 못한 일들이 일어날 수있다.")) – georg

답변

5

del nums[x]을하지 않는다 : 당신은 요소의 "독특한"목록을 만들려면, 집합 생성 :

unique_set = set(nums) 

을하고 다시 목록으로 변환 짧아지고 따라서 예외가 생깁니다.

당신은 간단하게, 당신은 번호가 동일한 인덱스를 찾을 수 set_nums = set(nums)

+0

환상적. 감사! – babbaggeii

3

nums에서 요소를 제거하므로 더 짧아지고 IndexError가 발생합니다.

어쨌든 모든 요소는 목록에서 하나 이상의 동일한 요소 (자체!)를 가지므로 모든 코드가 제거됩니다. 이 방법은 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, []) 
관련 문제