IDLEでコードを実行すると、次のエラーが発生します。
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
コード:-
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)
3.xでは、int/intは浮動小数点数を提供します。これはintではありません。
>>> 3/2
1.5
だからあなたの15行目
half = len(m)/2
フロートを半分にします。必要なのはダブルスラッシュです
half = len(m)//2
16行目のスライスでの使用に必要に応じて、intを半分にする。
あなたの場合、len(m)/2
はfloat
を返し、16行目はint
を期待しています。
次のように、キャストハーフをint
に入力する必要があります。
left = m[0:int(half)]