类型错误:切片索引必须是整数或无或具有 __index__ 方法 [英] TypeError: slice indices must be integers or None or have an __index__ method

查看:41
本文介绍了类型错误:切片索引必须是整数或无或具有 __index__ 方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在 IDLE 中运行代码时出现以下错误:

回溯(最近一次调用最后一次):文件C:/Python34/inversion3.py",第 44 行,在 <module> 中nInversions.inversionMergeSort(m) 文件C:/Python34/inversion3.py",第 16 行,inversionMergeSortleft = m[0:half] 类型错误:切片索引必须是整数或无或具有 __index__ 方法

代码:-

from collections import deque米 = []f = open("IntegerArray.txt")对于 f 中的行:m.append(int(line))类 InversionCount:def __init__(self, n):self.n = ndef inversionMergeSort(self, m):如果 len(m) <= 1:返回米一半 = len(m)/2左 = m[0:half]右 = m[半:]left = self.inversionMergeSort(left)right = self.inversionMergeSort(right)返回 self.inversionSort(left, right)def inversionSort(自我,左,右):leftQueue = deque(i for i in left)rightQueue = deque(j for j in right)有序列表 = []而 len(leftQueue) >0 或 len(rightQueue) >0:如果 len(leftQueue) >0 和 len(rightQueue) >0:如果 leftQueue[0] <= rightQueue[0]:orderedList.append(leftQueue[0])leftQueue.popleft()别的: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()返回有序列表nInversions = InversionCount(0)nInversions.inversionMergeSort(m)打印(nInversions.n)

解决方案

在 3.x 中,int/int 给出了一个浮点数.这不是整数.

<预><代码>>>>3/21.5

所以你的第 15 行

 half = len(m)/2

使半个浮点数.你需要的是一个双斜线

 half = len(m)//2

根据需要在第 16 行的切片中使用半个 int.

When running the code in IDLE gives the following error:

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:-

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)

解决方案

In 3.x, int/int gives a float. which is not an int.

>>> 3/2
1.5

so your line 15

        half = len(m)/2

makes half a float. What you need is a double slash

        half = len(m)//2

to make half an int, as needed for its use in the slice in line 16.

这篇关于类型错误:切片索引必须是整数或无或具有 __index__ 方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆