类型错误:切片索引必须是整数或None,或具有__index__方法

13

在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)

1
可能是一个重复的问题,与Slice indices must be integers or None or have __index__ method相同。 - Nir Alfasi
3个回答

40

在3.x中,int/int会得到一个浮点数,而不是整数。

>>> 3/2
1.5

所以你的第15行

        half = len(m)/2

这将使一个浮点数减半。你需要的是一个双斜杠。

        half = len(m)//2

为了在第16行的切片中使用,需要将一个整数分成一半。


1
能够工作,以前从未发现过这样的用法。非常感谢! - luyishisi
我在Python文档中找不到这个运算符,你知道在哪里可以找到吗? - user2478236
简单但有效。不错。 - CEB

7
在你的情况下,len(m)/2返回一个float,而第16行需要一个int
你应该将一半转换为int,如下所示:
left = m[0:int(half)]

0

仅使用 / 运算符将返回浮点数结果,您需要使用 // 运算符才能得到整数结果。

这将解决错误。对我有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接