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

2024-05-29 04:08:13 发布

您现在位置:Python中文网/ 问答频道 /正文

这段代码的目的是将一个字符串作为输入,然后生成一个字母出现频率的二维数组。因此,对于每个迭代,它都会增加数组中整数的值(例如HI将是[h][i] =+ 1

我的问题是错误信息

list indices must be integers or slices, not tuple

每当我运行下面的代码时就会出现。我已经改变了数组的创建方式,所以它现在被创建为一个列表,当我进入调试模式(letterArray变成了一个列表)时会得到确认

我将字母转换为ASCII的原因是,我可以将它与其他ASCII值进行比较,以同时清除字符串。我打算稍后将字符串转换为小写

我尝试过将letterArray转换成一个列表,尽管这不会改变任何事情,因为letterArray是一个列表。我找不到任何与相同问题的2d数组相关的信息

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]

有什么建议吗


Tags: andofthe字符串in列表forif
2条回答

您创建了嵌套列表,可以通过以下语法访问该列表:

x = letterArray[posY][posX]

我看到有一个答案可以解决您的错误消息,但我想给一些建议,以改善您的代码

这里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

相关问题 更多 >

    热门问题