簡體   English   中英

處理列表會出現錯誤“列表索引必須是整數或切片,而不是元組”

[英]processing a list gives the error "list indices must be integers or slices, not tuple"

此代碼旨在將一個字符串作為輸入,然后生成一個字母出現頻率的二維數組。 因此,對於每次迭代,它都會增加數組中整數的值(例如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]

有什么建議?

您制作了可以通過以下語法訪問的嵌套列表:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM