2015-02-02 4 views
1

IDLE의 코드를 실행하는 다음과 같은 오류를주는 __index__ 방법이 있어야합니다형식 오류 : 슬라이스 지수는 정수 또는 없음이거나

Traceback (most recent call last): File "C:/Python34/inversion3.py", 
line 44, in <module> 
    nInversions.inversionMergeSort(m) File "C:/Python34/inversion3.py", line 16, in inversionMergeSort 
    left = m[0:half] TypeError: slice indices must be integers or None or have an __index__ method 

CODE : - 3에서

from collections import deque 

m = [] 
f = open("IntegerArray.txt") 
for line in f: 
    m.append(int(line)) 

class InversionCount: 

    def __init__(self, n): 
     self.n = n 
    def inversionMergeSort(self, m): 
     if len(m) <= 1: 
      return m 
     half = len(m)/2 
     left = m[0:half] 
     right = m[half:] 
     left = self.inversionMergeSort(left) 
     right = self.inversionMergeSort(right) 
     return self.inversionSort(left, right) 

    def inversionSort(self, left, right): 
     leftQueue = deque(i for i in left) 
     rightQueue = deque(j for j in right) 
     orderedList = [] 
     while len(leftQueue) > 0 or len(rightQueue) > 0: 
      if len(leftQueue) > 0 and len(rightQueue) > 0: 
       if leftQueue[0] <= rightQueue[0]: 
        orderedList.append(leftQueue[0]) 
        leftQueue.popleft() 
       else: 
        orderedList.append(rightQueue[0]) 
        self.n += len(leftQueue) 
        rightQueue.popleft() 
      elif len(leftQueue) > 0: 
       orderedList.append(leftQueue[0]) 
       leftQueue.popleft() 
      elif len(rightQueue) > 0: 
       orderedList.append(rightQueue[0]) 
       rightQueue.popleft() 
     return orderedList 

nInversions = InversionCount(0) 
nInversions.inversionMergeSort(m) 
print (nInversions.n) 
+0

가능한 중복 : // 유래를 .com/questions/20733156/slice-indices-must-be-integers-or-none-or-have-index-method) – alfasin

답변

13

합니다. x, int/int는 float를 제공합니다. 그것은 int가 아닙니다.

>>> 3/2 
1.5 

그래서 당신의 라인 (15)

 half = len(m)/2 

반 float를합니다. 당신이 필요로하는 것은 귀하의 경우에는 라인 (16)

+0

당신은 나에게 많은 좌절감을 안겨 줬다. 감사.! – Ajeet

+0

이전에는 그러한 사용법을 발견 한 적이 없었습니다. – luyishisi

+0

어디서 파이썬 문서에서 찾을 수 있습니까?이 연산자를 찾지 못했습니다. – user2478236

1

의 조각에서의 사용에 필요한

 half = len(m)//2 

반 int를 만들 수있는 이중 슬래시이며, len(m)/2float 라인 (16)가 기대된다 반환 int.

당신은 다음과 같은 int 절반 캐스팅 입력해야

: [정수 또는 없음 수 또는 \ _ \ _ 지수 \ _ \ _ 방법이 있어야 슬라이스 지수 (HTTP의

left = m[0:int(half)]