猿问

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

此代码旨在将一个字符串作为输入,然后生成一个字母出现频率的二维数组。因此,对于每次迭代,它都会增加数组中整数的值(例如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 string

inputStringArray = list(inputString)        #break into char arrray

letterArray = []

posY = 28

x=0


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

确切的错误是:


Message=list indices must be integers or slices, not tuple

  Source=C:\Users\me\source\repos\InputRecorder\InputRecorder\Recording.py

StackTrace:

  File "C:\Users\me\source\repos\InputRecorder\InputRecorder\Recording.py", line 103, in KeysToArray

    x = letterArray[posY,posX]

有什么建议?


吃鸡游戏
浏览 717回答 2
2回答

慕的地6264312

您制作了可以通过以下语法访问的嵌套列表:x&nbsp;=&nbsp;letterArray[posY][posX]

Cats萌萌

我看到有一个答案可以解决您的错误消息,但我想提供一些建议来改进您的代码。这f1()是您的代码,f2()是我改进的建议;它的代码更少,在我看来更容易理解,运行时间也更少。def f1(inputString):&nbsp; &nbsp; inputStringArray = list(inputString)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # break into char arrray&nbsp; &nbsp; letterArray = []&nbsp; &nbsp; posY = 28&nbsp; &nbsp; for i in range(26):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# create balnk list of 0s of size 26x26&nbsp; &nbsp; &nbsp; &nbsp; letterArray.append([])&nbsp; &nbsp; &nbsp; &nbsp; for j in range(26):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; letterArray[i].append(0)&nbsp; &nbsp; for letter in inputStringArray:&nbsp; &nbsp; &nbsp; &nbsp; posX = ord(letter)-97&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# -97 so that a = 0, z = 25&nbsp; &nbsp; &nbsp; &nbsp; if posY is 28 and posX <= 26 and posX >= 0: # instantiate first instance of past letter&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; posY = posX&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; &nbsp; &nbsp; if posX <= 26 and posX >= 0:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # if the char is a letter&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x = letterArray[posY][posX]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x +=1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; letterArray[posY][posX] = x&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# increment the space in the array by 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; posY = posX&nbsp; &nbsp; &nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; return letterArraydef f2(input_str):&nbsp; &nbsp; max_n = 26&nbsp; &nbsp; # build nested lists with zeros&nbsp; &nbsp; letter_list = [&nbsp; &nbsp; &nbsp; &nbsp; [0, ] * max_n&nbsp; &nbsp; &nbsp; &nbsp; for _ in range(max_n)]&nbsp; &nbsp; # 'None' is usually used to indicate an invalid value&nbsp; &nbsp; prev_i = None&nbsp; &nbsp; for letter in input_str:&nbsp; &nbsp; &nbsp; &nbsp; curr_i = ord(letter) - 97&nbsp; &nbsp; &nbsp; &nbsp; if 0 <= curr_i <= max_n:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if prev_i is not None:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; letter_list[prev_i][curr_i] += 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; prev_i = curr_i&nbsp; &nbsp; 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 == r2True比较运行时(此示例输入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
随时随地看视频慕课网APP

相关分类

Python
我要回答