为了账号安全,请及时绑定邮箱和手机立即绑定

处理列表会出现错误“列表索引必须是整数或切片,而不是元组”

处理列表会出现错误“列表索引必须是整数或切片,而不是元组”

吃鸡游戏 2021-12-26 10:56:03
此代码旨在将一个字符串作为输入,然后生成一个字母出现频率的二维数组。因此,对于每次迭代,它都会增加数组中整数的值(例如HI将是[h][i] =+ 1)。我的问题是错误信息list indices must be integers or slices, not tuple每当我运行以下代码时就会出现。我改变了数组的创建方式,所以它现在被创建为一个列表,当我进入调试模式时得到确认(letterArray 成为一个列表列表。)我将字母转换为 ASCII 的原因是我可以将它与其他 ASCII 值进行比较以同时清理字符串。我打算稍后将字符串转换为小写。我尝试将 letterArray 转换为列表,尽管这不会改变任何内容,因为 letterArray 是一个列表。我在具有相同问题的二维数组上找不到任何相关信息。inputString = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat'  #just a test stringinputStringArray = list(inputString)        #break into char arrrayletterArray = []posY = 28x=0for i in range(26):             #create balnk list of 0s of size 26x26    letterArray.append([])    for j in range(26):        letterArray[i].append(0)for letter in inputStringArray:    posX = ord(letter)-97                   #-97 so that a = 0, z = 25    if posY is 28 and posX <= 26 and posX >= 0:                     #instantiate first instance of past letter        posY = posX        continue    if posX <= 26 and posX >= 0:                #if the char is a letter        x = letterArray[posY,posX]        x +=1        letterArray[posY,posX] = x             #increment the space in the array by 1        posY = posX    else:        continue确切的错误是:Message=list indices must be integers or slices, not tuple  Source=C:\Users\me\source\repos\InputRecorder\InputRecorder\Recording.pyStackTrace:  File "C:\Users\me\source\repos\InputRecorder\InputRecorder\Recording.py", line 103, in KeysToArray    x = letterArray[posY,posX]有什么建议?
查看完整描述

2 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

您制作了可以通过以下语法访问的嵌套列表:

x = letterArray[posY][posX]


查看完整回答
反对 回复 2021-12-26
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

我看到有一个答案可以解决您的错误消息,但我想提供一些建议来改进您的代码。


这f1()是您的代码,f2()是我改进的建议;它的代码更少,在我看来更容易理解,运行时间也更少。


def f1(inputString):

    inputStringArray = list(inputString)            # break into char arrray

    letterArray = []

    posY = 28


    for i in range(26):                             # create balnk list of 0s of size 26x26

        letterArray.append([])

        for j in range(26):

            letterArray[i].append(0)


    for letter in inputStringArray:

        posX = ord(letter)-97                       # -97 so that a = 0, z = 25

        if posY is 28 and posX <= 26 and posX >= 0: # instantiate first instance of past letter

            posY = posX

            continue


        if posX <= 26 and posX >= 0:                # if the char is a letter

            x = letterArray[posY][posX]

            x +=1

            letterArray[posY][posX] = x             # increment the space in the array by 1

            posY = posX

        else:

            continue


    return letterArray


def f2(input_str):

    max_n = 26


    # build nested lists with zeros

    letter_list = [

        [0, ] * max_n

        for _ in range(max_n)]


    # 'None' is usually used to indicate an invalid value

    prev_i = None


    for letter in input_str:

        curr_i = ord(letter) - 97


        if 0 <= curr_i <= max_n:

            if prev_i is not None:

                letter_list[prev_i][curr_i] += 1


            prev_i = curr_i


    return letter_list

断言结果相同:


>>> s = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat'

>>> r1 = f1(s)

>>> r2 = f2(s)

>>> r1 == r2

True

比较运行时(此示例输入f2需要一半的时间f1):


>>> import timeit

>>> timeit.timeit('f1(s)', 'from __main__ import f1, s', number=10000)

1.0122240540222265

>>> timeit.timeit('f2(s)', 'from __main__ import f2, s', number=10000)

0.4270052219508216


查看完整回答
反对 回复 2021-12-26
  • 2 回答
  • 0 关注
  • 696 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信